fix asyncio calling, accept changes before mutating
This commit is contained in:
44
state.py
44
state.py
@@ -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 })
|
||||
|
||||
Reference in New Issue
Block a user