56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
from state_management import Action, manager
|
|
from abots.helpers import generator, coroutine, infinitedict
|
|
from time import monotonic as time
|
|
from gevent import Greenlet, spawn, sleep, joinall
|
|
from gevent.queue import Queue, Empty
|
|
#from queue import Queue, Empty
|
|
|
|
HOOKS = dict()
|
|
|
|
def reducer(state, action):
|
|
if action.name == "ADD":
|
|
state["counter"] = state.get("counter", 0) + action.data
|
|
|
|
return state
|
|
|
|
def register(func):
|
|
#f = generator(func)
|
|
#f.start()
|
|
HOOKS[func.__name__.lower()] = func#f()
|
|
return func
|
|
|
|
#@coroutine
|
|
def pull(queue):
|
|
while True:
|
|
task = queue.get()
|
|
assert isinstance(task, tuple), f"Expected tuple: {task}"
|
|
assert len(task) == 2, f"Invalid format: {task}"
|
|
hook_name, message = task
|
|
hook = HOOKS.get(hook_name)
|
|
hook(queue, message)
|
|
|
|
@generator
|
|
def push(queue):
|
|
task = (yield)
|
|
assert isinstance(task, tuple), f"Expected tuple: {task}"
|
|
assert len(task) == 2, f"Invalid format: {task}"
|
|
queue.put(task)
|
|
|
|
@register
|
|
def ping(queue, message):
|
|
print(f"PING: {message}")
|
|
task = "pong", message
|
|
queue.put(task)
|
|
|
|
@register
|
|
def pong(queue, message):
|
|
print(f"PONG: {message}")
|
|
task = "ping", message
|
|
queue.put(task)
|
|
|
|
state, dispatch = manager(reducer)
|
|
queue = Queue()
|
|
yang = push(queue)
|
|
yin = spawn(pull, queue)
|
|
start = lambda: joinall([yin])
|