3 from twisted.internet import defer, reactor
4 from twisted.python import failure, log
9 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)
23 res = self._once = Event()
26 def happened(self, *event):
27 for id, func in sorted(self.observers.iteritems()):
31 log.err(None, "Error while processing Event callbacks:")
33 if self._once is not None:
34 self._once.happened(*event)
37 def get_deferred(self, timeout=None):
40 id1 = once.watch(lambda *event: df.callback(event))
41 if timeout is not None:
43 df.errback(failure.Failure(defer.TimeoutError('in Event.get_deferred')))
46 delay = reactor.callLater(timeout, do_timeout)
47 x = once.watch(lambda *event: delay.cancel())
50 class Variable(object):
51 def __init__(self, value):
53 self.changed = Event()
56 if value == self.value:
60 self.changed.happened(value)
62 def get_not_none(self):
63 if self.value is not None:
64 return defer.succeed(self.value)
67 self.changed.once.watch(df.callback)