Since this thing is on the innerwebs I suppose it should have a
[python_utils.git] / collect / trie.py
index 3e4c9172fbbf3b01202f6c9ccc5b2d4ff607fcc1..547d67a4124abc07f425ecf21616bf2c509beb4e 100644 (file)
@@ -1,6 +1,15 @@
 #!/usr/bin/env python3
 
-from typing import Any, Sequence
+# © Copyright 2021-2022, Scott Gasch
+
+"""This is a Trie class, see: https://en.wikipedia.org/wiki/Trie.
+
+It attempts to follow Pythonic container patterns.  See doctests
+for examples.
+
+"""
+
+from typing import Any, Generator, Sequence
 
 
 class Trie(object):
@@ -11,11 +20,13 @@ class Trie(object):
     for examples.
 
     """
+
     def __init__(self):
         self.root = {}
         self.end = "~END~"
         self.length = 0
         self.viz = ''
+        self.content_generator: Generator[str] = None
 
     def insert(self, item: Sequence[Any]):
         """
@@ -241,9 +252,15 @@ class Trie(object):
             return None
         return [x for x in node if x != self.end]
 
-    def repr_fancy(self, padding: str, pointer: str, parent: str, node: Any, has_sibling: bool):
+    def repr_fancy(
+        self,
+        padding: str,
+        pointer: str,
+        node: Any,
+        has_sibling: bool,
+    ):
         if node is None:
-            return
+            return ''
         if node is not self.root:
             ret = f'\n{padding}{pointer}'
             if has_sibling:
@@ -268,7 +285,7 @@ class Trie(object):
                     has_sibling = False
                 pointer += f'{child}'
                 child_count -= 1
-                ret += self.repr_fancy(padding, pointer, node, node[child], has_sibling)
+                ret += self.repr_fancy(padding, pointer, node[child], has_sibling)
         return ret
 
     def repr_brief(self, node, delimiter):
@@ -281,7 +298,7 @@ class Trie(object):
         >>> t.insert([10, 10, 10, 1])
         >>> t.insert([10, 10, 10, 2])
         >>> t.repr_brief(t.root, '.')
-        '10.[0.0.[1, 2], 10.10.[1, 2]]'
+        '10.[0.0.[1,2],10.10.[1,2]]'
 
         """
         child_count = 0
@@ -291,11 +308,11 @@ class Trie(object):
                 child_count += 1
                 child_rep = self.repr_brief(node[child], delimiter)
                 if len(child_rep) > 0:
-                    my_rep += str(child) + delimiter + child_rep + ", "
+                    my_rep += str(child) + delimiter + child_rep + ","
                 else:
-                    my_rep += str(child) + ", "
+                    my_rep += str(child) + ","
         if len(my_rep) > 1:
-            my_rep = my_rep[:-2]
+            my_rep = my_rep[:-1]
         if child_count > 1:
             my_rep = f'[{my_rep}]'
         return my_rep
@@ -323,9 +340,10 @@ class Trie(object):
                  └──2
 
         """
-        return self.repr_fancy('', '*', self.root, self.root, False)
+        return self.repr_fancy('', '*', self.root, False)
 
 
 if __name__ == '__main__':
     import doctest
+
     doctest.testmod()