fix asyncio calling, accept changes before mutating

This commit is contained in:
2021-04-02 21:27:58 +02:00
parent e6e63efb3f
commit 7556deede0
4 changed files with 58 additions and 41 deletions

View File

@@ -3,31 +3,41 @@ import copy
from deepmerge import always_merger
STATE = {"initialized": 0}
state_lock = asyncio.Lock()
NOTIFY_CALLBACKS = []
ON_INPUT_CALLBACKS = []
ON_CHANGE_CALLBACKS = []
def register_callback(callback):
global NOTIFY_CALLBACKS
NOTIFY_CALLBACKS = NOTIFY_CALLBACKS + [callback]
def register_on_change_callback(callback):
global ON_CHANGE_CALLBACKS
ON_CHANGE_CALLBACKS = ON_CHANGE_CALLBACKS + [callback]
def unregister_callback(callback):
NOTIFY_CALLBACK = [ x for x in NOTIFY_CALLBACKS if x != callback ]
def unregister_on_change_callback(callback):
ON_CHANGE_CALLBACK = [ x for x in ON_CHANGE_CALLBACKS if x != callback ]
def register_on_input_callback(callback):
global ON_INPUT_CALLBACKS
ON_INPUT_CALLBACKS = ON_INPUT_CALLBACKS + [callback]
def unregister_on_input_callback(callback):
ON_INPUT_CALLBACK = [ x for x in ON_INPUT_CALLBACKS if x != callback ]
async def mutate(delta):
global STATE
async with state_lock:
old_state = copy.deepcopy(STATE)
STATE = always_merger.merge(STATE, delta)
for callback in NOTIFY_CALLBACKS:
await callback(old_state, STATE)
old_state = copy.deepcopy(STATE)
STATE = always_merger.merge(STATE, delta)
for callback in ON_CHANGE_CALLBACKS:
await callback(old_state, delta)
async def get_data():
async def propagate(delta):
global STATE
async with state_lock:
return STATE
old_state = copy.deepcopy(STATE)
for callback in ON_INPUT_CALLBACKS:
await callback(old_state, delta)
def get_data():
global STATE
return STATE
async def inc_initialized():
global STATE
async with state_lock:
STATE["initialized"] += 1
await mutate({"initialized": STATE["initialized"]+1 })