Observable.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. class Observable:
  2. @staticmethod
  3. def create(source, parent=None, key=None):
  4. from . import ObservableDict
  5. from . import ObservableList
  6. if isinstance(source, ObservableDict) or isinstance(source, ObservableList):
  7. source.parent = parent
  8. source.key = key
  9. return source
  10. if isinstance(source, dict):
  11. return ObservableDict(source, parent, key)
  12. if isinstance(source, list):
  13. return ObservableList(source, parent, key)
  14. else:
  15. return source
  16. def __init__(self, parent, key):
  17. self.parent = parent
  18. self.key = key
  19. self.subscriptions = []
  20. def subscribe(self, handler, immediate=False):
  21. self.subscriptions.append(handler)
  22. if immediate:
  23. handler(self, [])
  24. def notify(self, keys=None):
  25. if keys is None:
  26. keys = []
  27. for s in self.subscriptions:
  28. s(self, keys)
  29. if self.parent is not None:
  30. if self.key is None:
  31. raise ValueError
  32. keys.insert(0, self.key)
  33. self.parent.notify(keys)