reworking
[p2pool.git] / p2pool / util / variable.py
1 import itertools
2
3 from twisted.internet import defer
4
5 class Event(object):
6     def __init__(self):
7         self.observers = {}
8         self.one_time_observers = {}
9         self.id_generator = itertools.count()
10     
11     def watch(self, func):
12         id = self.id_generator.next()
13         self.observers[id] = func
14         return id
15     def unwatch(self, id):
16         self.observers.pop(id)
17     
18     def watch_one_time(self, func):
19         id = self.id_generator.next()
20         self.one_time_observers[id] = func
21         return id
22     def unwatch_one_time(self, id):
23         self.one_time_observers.pop(id)
24     
25     def happened(self, event=None):
26         for func in self.observers.itervalues():
27             func(event)
28         
29         one_time_observers = self.one_time_observers
30         self.one_time_observers = {}
31         for func in one_time_observers.itervalues():
32             func(event)
33     
34     def get_deferred(self):
35         df = defer.Deferred()
36         self.watch_one_time(df.callback)
37         return df
38
39 class Variable(object):
40     def __init__(self, value):
41         self.value = value
42         self.changed = Event()
43     
44     def set(self, value):
45         if value == self.value:
46             return
47         
48         self.value = value
49         self.changed.happened(value)
50     
51     def get_not_none(self):
52         if self.value is not None:
53             return defer.succeed(self.value)
54         else:
55             df = defer.Deferred()
56             self.changed.watch_one_time(df.callback)
57             return df