Files
2020-07-29 12:59:12 +02:00

220 lines
5.6 KiB
Python

from .dictmap import Map
class Tree(Map):
"""
Ideas for new method names:
deploy, diffuse, broadcast, transmit, disseminate
"""
def __init__(self, *args, disperse=True):
super().__init__(*args)
if disperse:
self.disperse()
# def __str__(self,n=1):
# return "".join(map(lambda e:str(dict(e[1])) if isinstance(e, Tree) else str(e), self.items()))
# self.deploy()
# if n==1:
# return super().__str__()
# else:
# return str(dict(self))
def subMap(self,f):
"""Apply f and yield each sub value."""
for e in self.subValues():
yield f(e)
def getLevel(self, n=1):
"""Return the level in the Tree."""
m = n
for e in self.values():
if isinstance(e, Tree):
l = e.getLevel(n+1)
if l>m: m = l
return m
def search(self, key):
"""Search for an element using its key in the Tree."""
try:
return self.get(key)
except:
for e in self.values():
if isinstance(e,Tree):
v = e.search(key)
if v: return v
# raise IndexError(f"{key} not found")
def find(self, path):
"""Find an element using its path in the Tree."""
if len(path)==1:
return self[path[0]]
else:
return self[path[0]].find(path[1:])
def put(self, path, value):
"""Set an element in the Tree."""
if len(path)==1:
self[path[0]] = value
else:
if path[0] in self:
self[path[0]].set(path[1:], value)
else:
self[path[0]] = Tree()
self[path[0]].put(path[1:], value)
def distribute(self,f):
"""Distribute f for all values."""
for (k,v) in self.items():
self[k] = f(v)
def spread(self, f):
"""Apply f to set all sub values."""
for (k,v) in self.items():
if isinstance(v,Tree):
v.spread(f)
else:
self[k] = f(v)
def deploy(self, f):
"""Apply f over all sub values to return a new Tree."""
m = self.copy()
m.spread(f)
return m
def propagate(self, f):
"""Propagate f over all full values."""
for (k,v) in self.items():
self[k] = f(v)
if isinstance(v,Tree):
self[k].propagate(f)
def disperse(self):
"""Disperse the Tree type."""
for (k,v) in self.items():
try: #Check if v is iterable
iter(v)
self[k] = Tree(v)
self[k].disperse()
except:
pass
def subKeys(self):
"""Iterate all sub keys."""
for (k,v) in self.items():
if isinstance(v,Tree):
for k in v.subKeys():
yield k
else:
yield k
def fullKeys(self):
"""Iterate all full keys."""
for (k,v) in self.items():
yield k
if isinstance(v,Tree):
for k in v.fullKeys():
yield k
def subValues(self):
"""Iterate all sub values."""
for (k,v) in self.items():
if isinstance(v,Tree):
for v in v.subValues():
yield v
else:
yield v
def fullValues(self):
"""Iterate all full values."""
for (k,v) in self.items():
yield v
if isinstance(v,Tree):
for v in v.fullValues():
yield v
def subPaths(self):
"""Iterate all sub paths."""
for (k,v) in self.items():
if isinstance(v,Tree):
for p in v.subPaths():
yield [k]+p
else:
yield [k]
def fullPaths(self):
"""Iterate all full paths."""
for (k,v) in self.items():
yield [k]
if isinstance(v,Tree):
for p in v.fullPaths():
yield [k]+p
def map(self, f):
return []
level = property(getLevel)
if __name__ == "__main__":
c = {2:{2:3},1:3}
d = {1: 5, 3: 4, 0: 3}
a = {6 : d, 3:{6:d}}
b = {7:d, 9:{2:a, 8:d}, 0:{5:2}}
print(list(sorted(d)))
t = Tree({11:[1,2],6:{9:b}, 8:8})
t.put(["osef",9,1,2], 5)
t.put([0,5],8)
print('searching:', t.search(3))
print("finding:", t.find([6,9,9,2,6,3]))
print(t)
print(t.getLevel())
print(t.level)
d = {
"SuperGroup":{
"PlayerGroup":{
"Player0":"player0",
"Player1":"player1"
},
"AsteroidGroup":{
"Asteroid1":"asteroid1",
"Asteroid2":"asteroid2"
},
"Test": [1,2,3]
}
}
g = Tree(d)
print(g.search("Player0"))
print(g.search("Asteroid1"))
print(list(g.subKeys()))
print(list(g.fullKeys()))
print(list(g.subValues()))
print(list(g.fullValues()))
print(list(g.subPaths()))
print(list(g.fullPaths()))
for i,v in enumerate(t.subValues()):
if i==0:
print(v)
v[0] = 5
print("i==3:",v)
print(t)
print(c)
for i, v in enumerate(c.values()):
print(v)
# if i==0:
# print(v)
# v[2] = 12879439
# print("i=3:", v)
print(c)
print(list(g.subValues()))
l = g.search("Test")
l[0] = 9
# print(g.search("bla"))
# print(t.get(3))