Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
1# Based on http://stackoverflow.com/a/2022629
2
3
4class Event(list):
5
6 def __call__(self, *args, **kwargs):
7 for f in self[:]:
8 if "once" in dir(f) and f in self:
9 self.remove(f)
10 f(*args, **kwargs)
11
12 def __repr__(self):
13 return "Event(%s)" % list.__repr__(self)
14
15 def once(self, func, name=None):
16 func.once = True
17 func.name = None
18 if name: # Dont function with same name twice
19 names = [f.name for f in self if "once" in dir(f)]
20 if name not in names:
21 func.name = name
22 self.append(func)
23 else:
24 self.append(func)
25 return self
26
27
28if __name__ == "__main__":
29 def testBenchmark():
30 def say(pre, text):
31 print("%s Say: %s" % (pre, text))
32
33 import time
34 s = time.time()
35 on_changed = Event()
36 for i in range(1000):
37 on_changed.once(lambda pre: say(pre, "once"), "once")
38 print("Created 1000 once in %.3fs" % (time.time() - s))
39 on_changed("#1")
40
41 def testUsage():
42 def say(pre, text):
43 print("%s Say: %s" % (pre, text))
44
45 on_changed = Event()
46 on_changed.once(lambda pre: say(pre, "once"))
47 on_changed.once(lambda pre: say(pre, "once"))
48 on_changed.once(lambda pre: say(pre, "namedonce"), "namedonce")
49 on_changed.once(lambda pre: say(pre, "namedonce"), "namedonce")
50 on_changed.append(lambda pre: say(pre, "always"))
51 on_changed("#1")
52 on_changed("#2")
53 on_changed("#3")
54
55 testBenchmark()