taijitu/taijitu.py

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])