core: typing and dataclass improvements, start creation of env and csys
This commit is contained in:
parent
c1bff58ad3
commit
365cbfd5fd
3 changed files with 21 additions and 10 deletions
|
|
@ -1,18 +1,22 @@
|
|||
# scopes.core.actor
|
||||
|
||||
import asyncio
|
||||
from collections.abc import Awaitable, Callable
|
||||
from typing import Any, Optional
|
||||
|
||||
from scopes.util import keywords as k
|
||||
|
||||
async def loop(q, bhv):
|
||||
type Behavior = Callable[[Any], Awaitable[Behavior | None]]
|
||||
|
||||
async def loop(q: asyncio.Queue, bhv: Behavior) -> None:
|
||||
while True:
|
||||
msg = await q.get()
|
||||
if msg is k.quit:
|
||||
break
|
||||
bhv = await bhv(msg) or bhv
|
||||
|
||||
def create(bhv, group=None):
|
||||
q = asyncio.Queue()
|
||||
def create(bhv: Behavior, group: Optional[asyncio.TaskGroup] = None) -> asyncio.Queue:
|
||||
q: asyncio.Queue = asyncio.Queue()
|
||||
if group is None:
|
||||
asyncio.create_task(loop(q, bhv))
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
from __future__ import annotations # no check of type annotations at runtime
|
||||
import asyncio
|
||||
from collections.abc import AsyncGenerator, Callable, Coroutine
|
||||
from collections.abc import Awaitable, Callable, Coroutine
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Any
|
||||
|
||||
|
|
@ -13,12 +13,15 @@ from scopes.util import keywords as k, Symbol
|
|||
|
||||
type Mailbox = asyncio.Queue
|
||||
type Categ = tuple[Symbol, Symbol]
|
||||
type Proc = Callable[[Scope, Message], AsyncGenerator[Scope]]
|
||||
type Proc = Callable[[Scope, Message], Awaitable[Scope]]
|
||||
type Program = Callable[[Scope], Proc]
|
||||
type Syn = Callable[[Message], Message]
|
||||
|
||||
async def proc_dummy(scope: Scope, msg: Message) -> AsyncGenerator[Scope]:
|
||||
yield scope
|
||||
async def proc_dummy(scope: Scope, msg: Message) -> Scope:
|
||||
await scope.environ.put(msg)
|
||||
return scope
|
||||
|
||||
global_mailbox: Mailbox = asyncio.Queue()
|
||||
|
||||
@dataclass
|
||||
class Scope:
|
||||
|
|
@ -26,16 +29,19 @@ class Scope:
|
|||
value: Any = 0
|
||||
categ: Categ = (k.csys, k.c00)
|
||||
stage: Symbol = k.initial
|
||||
proc: Proc = proc_dummy
|
||||
proc: Proc = field(init=False)
|
||||
program: Program = lambda x: proc_dummy
|
||||
syns: list[Syn] = field(default_factory=list)
|
||||
environ: Mailbox = field(default_factory=asyncio.Queue)
|
||||
environ: Mailbox = global_mailbox
|
||||
|
||||
def __post_init__(self):
|
||||
self.set_proc()
|
||||
|
||||
def set_proc(self) -> Scope:
|
||||
self.proc = self.program(self)
|
||||
return self
|
||||
|
||||
def create_scope(env: Mailbox, cat=(k.csys, k.c00), **kw):
|
||||
def create_scope(env: Mailbox, cat=(k.csys, k.c00), **kw) -> Scope:
|
||||
scope = Scope(environ=env, categ=cat, **kw)
|
||||
return scope.set_proc()
|
||||
|
||||
|
|
|
|||
|
|
@ -68,5 +68,6 @@ async def meta_env(coll):
|
|||
async def test_core(meta_env, coll):
|
||||
env_scope = environ.create(meta_env)
|
||||
assert env_scope.value == 0
|
||||
#print(meta_env)
|
||||
await asyncio.sleep(0.01)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue