3 from twisted.internet import defer, reactor
4 from twisted.python import failure, log
9 self.id_generator = itertools.count()
13 def run_and_watch(self, func):
15 return self.watch(func)
16 def watch(self, func):
17 id = self.id_generator.next()
18 self.observers[id] = func
20 def unwatch(self, id):
21 self.observers.pop(id)
27 res = self._once = Event()
30 def happened(self, *event):
33 once, self._once = self._once, None
35 for id, func in sorted(self.observers.iteritems()):
39 log.err(None, "Error while processing Event callbacks:")
44 def get_deferred(self, timeout=None):
47 id1 = once.watch(lambda *event: df.callback(event))
48 if timeout is not None:
50 df.errback(failure.Failure(defer.TimeoutError('in Event.get_deferred')))
53 delay = reactor.callLater(timeout, do_timeout)
54 x = once.watch(lambda *event: delay.cancel())
57 class Variable(object):
58 def __init__(self, value):
60 self.changed = Event()
61 self.transitioned = Event()
64 if value == self.value:
69 self.changed.happened(value)
70 self.transitioned.happened(oldvalue, value)
72 @defer.inlineCallbacks
73 def get_when_satisfies(self, func):
76 defer.returnValue(self.value)
77 yield self.changed.once.get_deferred()
79 def get_not_none(self):
80 return self.get_when_satisfies(lambda val: val is not None)