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

View file

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

View file

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