core: typing and dataclass improvements, start creation of env and csys

This commit is contained in:
Helmut Merz 2026-10-18 08:08:00 +02:00
parent c1bff58ad3
commit 365cbfd5fd
3 changed files with 21 additions and 10 deletions

View file

@ -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:

View file

@ -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()

View file

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