return res
def happened(self, *event):
+ self.times += 1
+
once, self._once = self._once, None
for id, func in sorted(self.observers.iteritems()):
if once is not None:
once.happened(*event)
-
- self.times += 1
def get_deferred(self, timeout=None):
once = self.once
def __init__(self, value):
self.value = value
self.changed = Event()
+ self.transitioned = Event()
def set(self, value):
if value == self.value:
return
+ oldvalue = self.value
self.value = value
self.changed.happened(value)
+ self.transitioned.happened(oldvalue, value)
+
+ @defer.inlineCallbacks
+ def get_when_satisfies(self, func):
+ while True:
+ if func(self.value):
+ defer.returnValue(self.value)
+ yield self.changed.once.get_deferred()
def get_not_none(self):
- if self.value is not None:
- return defer.succeed(self.value)
- else:
- df = defer.Deferred()
- self.changed.once.watch(df.callback)
- return df
+ return self.get_when_satisfies(lambda val: val is not None)