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 once, self._once = self._once, None
29 for id, func in sorted(self.observers.iteritems()):
33 log.err(None, "Error while processing Event callbacks:")
38 def get_deferred(self, timeout=None):
41 id1 = once.watch(lambda *event: df.callback(event))
42 if timeout is not None:
44 df.errback(failure.Failure(defer.TimeoutError('in Event.get_deferred')))
47 delay = reactor.callLater(timeout, do_timeout)
48 x = once.watch(lambda *event: delay.cancel())
51 class Variable(object):
52 def __init__(self, value):
54 self.changed = Event()
57 if value == self.value:
61 self.changed.happened(value)
63 def get_not_none(self):
64 if self.value is not None:
65 return defer.succeed(self.value)
68 self.changed.once.watch(df.callback)