Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.57 KB | None | 0 0
  1. import tools.async
  2. import itertools
  3. import heapq
  4. import random
  5. import time
  6.  
  7.  
  8. def get_adder(l):
  9.     def _adder(v):
  10.         l.append(v)
  11.     return _adder
  12.  
  13.  
  14. def get_remover(l):
  15.     def _remover(v):
  16.         l.remove(v)
  17.     return _remover
  18.  
  19.  
  20. def complete_on(on_list, f):
  21.     def _f(*args, **kwargs):
  22.         value = f(*args, **kwargs)
  23.         for _on in on_list:
  24.             _on()
  25.         return value
  26.     return _f
  27.  
  28. random.seed(time.time().is_integer())
  29.  
  30.  
  31.  
  32. invoke = lambda f, *args, **kwargs: f(*args, **kwargs)
  33.  
  34.  
  35. class Observable():
  36.     def __init__(self, default_value=None):
  37.         var = default_value
  38.  
  39.         def _set(value):
  40.             def assign():
  41.                 nonlocal var
  42.                 var = value
  43.             invoke(assign)
  44.  
  45.         onset = []
  46.         self.add_onset = get_adder(onset)
  47.         self.remove_onset = get_remover(onset)
  48.         self.set = complete_on(onset, _set)
  49.  
  50.         def _get():
  51.             return var
  52.  
  53.         onget = []
  54.         self.add_onget = get_adder(onget)
  55.         self.remove_onget = get_remover(onget)
  56.         self.get = complete_on(onget, _get)
  57.  
  58.         hash = random.randint(0, 2**63 + (2**63 - 1))
  59.         self.__hash__ = lambda: hash.__hash__()
  60.  
  61.  
  62. class UpdateableModel:
  63.     def __init__(self, *observables, updater=lambda: None, update_with_eq_value=False):
  64.         var = None
  65.         def _get():
  66.             return var
  67.  
  68.         def _set(value):
  69.             nonlocal var
  70.             var = value
  71.         onget = []
  72.         onset = []
  73.         self.add_onget = get_adder(onget)
  74.         self.add_onset = get_adder(onset)
  75.         self.remove_onget = get_remover(onget)
  76.         self.remove_onset = get_remover(onset)
  77.         self.get = complete_on(onget, _get)
  78.         setter = complete_on(onset, _set)
  79.  
  80.         def _update():
  81.             value = updater()
  82.             if value != var or update_with_eq_value:
  83.                 setter(value)
  84.  
  85.         self._update = _update
  86.  
  87.         self._deep = 0
  88.  
  89.         for obs in observables:
  90.             if isinstance(obs, UpdateableModel):
  91.                 self._deep = max(self._deep, obs._deep + 1)
  92.                 obs.add_onset(lambda: invoke(self._update))
  93.             elif isinstance(obs, Observable):
  94.                 self._deep = max(self._deep, 1)
  95.                 obs.add_onset(lambda: invoke(self._update))
  96.             else:
  97.                 raise ValueError('В observables хранятся не все значения')
  98.  
  99.         self._update()
  100.  
  101.         hash = random.randint(0, 2**63 + (2**63 - 1))
  102.         self.__hash__ = lambda: hash.__hash__()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement