Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
at main 55 lines 1.6 kB view raw
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()