diff --git a/libsaria/trees.py b/libsaria/trees.py index f6367d4e..f4349888 100644 --- a/libsaria/trees.py +++ b/libsaria/trees.py @@ -121,6 +121,18 @@ class ValTree(Tree): def __disp__(self, child, level): return "%s (%s)", (child, self[child].value) + def __walk_vals__(self, path): + node = self + res = [] + for key in path: + node = node[key] + res.append(node.value) + return res + + def walk_vals(self): + for path in self.walk(): + yield self.__walk_vals__(path) + def insert(self, path, values): child = self.__insert__(path) if len(values) > 0: @@ -137,6 +149,19 @@ class DLValTree(DLTree, ValTree): DLTree.__init__(self) ValTree.__init__(self) + def walk_vals_backwards(self, child = None): + key = None + if child != None: + idc = id(child) + key = [i[0] for i in self.items() if id(i[1]) == idc] + if self.parent == None: + return [self[key[0]].value] + ret = self.parent.walk_vals_backwards(self) + if key: + return ret + [self[key[0]].value] + else: + return ret + def insert(self, path, values): child = self.__insert__(path) child.parent = self diff --git a/tests/trees.py b/tests/trees.py index 69fd6c88..fce49fa2 100644 --- a/tests/trees.py +++ b/tests/trees.py @@ -45,6 +45,8 @@ from libsaria import trees #tree.insert(["a", "b", "c", "e"], [1, 2, 3, 5]) #tree.insert(["f", "g", "h", "i"], [6, 7, 8, 9]) #tree.disp() +#for vals in tree.walk_vals(): +# print vals tree = trees.DLValTree() @@ -52,7 +54,11 @@ n = tree.insert(["a", "b", "c", "d"], [1, 2, 3, 4]) o = tree.insert(["a", "b", "c", "e"], [1, 2, 3, 5]) p = tree.insert(["f", "g", "h", "i"], [6, 7, 8, 9]) tree.disp() - +for path in tree.walk_vals(): + print path print n.walk_backwards() +print n.walk_vals_backwards() print o.walk_backwards() +print o.walk_vals_backwards() print p.walk_backwards() +print p.walk_vals_backwards()