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