3 from twisted.internet import defer, reactor
4 from twisted.python import failure, log
9 self.one_time_observers = {}
10 self.id_generator = itertools.count()
12 def watch(self, func):
13 id = self.id_generator.next()
14 self.observers[id] = func
16 def unwatch(self, id):
17 self.observers.pop(id)
19 def watch_one_time(self, func):
20 id = self.id_generator.next()
21 self.one_time_observers[id] = func
23 def unwatch_one_time(self, id):
24 self.one_time_observers.pop(id)
26 def happened(self, event=None):
27 for id, func in sorted(self.observers.iteritems()):
31 log.err(None, "Error while processing Event callbacks:")
33 one_time_observers = self.one_time_observers
34 self.one_time_observers = {}
35 for id, func in sorted(one_time_observers.iteritems()):
39 log.err(None, "Error while processing Event callbacks:")
41 def get_deferred(self, timeout=None):
43 id1 = self.watch_one_time(df.callback)
44 if timeout is not None:
46 df.errback(failure.Failure(defer.TimeoutError()))
47 self.unwatch_one_time(id1)
48 self.unwatch_one_time(x)
49 delay = reactor.callLater(timeout, do_timeout)
50 x = self.watch_one_time(lambda value: delay.cancel())
53 class Variable(object):
54 def __init__(self, value):
56 self.changed = Event()
59 if value == self.value:
63 self.changed.happened(value)
65 def get_not_none(self):
66 if self.value is not None:
67 return defer.succeed(self.value)
70 self.changed.watch_one_time(df.callback)