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