Source code for iot_light_control.state
# -*- coding: utf-8 -*-
from collections import defaultdict
[docs]class State(dict):
def __init__(self, store, *args, **kwargs):
self._store = store
super(State, self).__init__(*args, **kwargs)
def __setitem__(self, key, value):
old_value = self.get(key)
if old_value != value:
super(State, self).__setitem__(key, value)
self._store.notify(key, value, old_value)
[docs]class StateStore(object):
def __init__(self):
self._state = State(self)
self._observers = defaultdict(list)
@property
def state(self):
return self._state
@state.setter
def state(self, new_state):
old_state = self._state
self._state = State(self)
self._state.update(new_state)
for k in new_state:
old_val = old_state.get(k)
if new_state[k] != old_val:
self.notify(k, new_state[k], old_val)
[docs] def notify(self, key, value, old_value):
observers = self._observers.get(key)
if not observers:
return
for obs in observers:
obs(key, value, old_value)
[docs] def subscribe(self, key, observer):
self._observers[key].append(observer)