From 365cbfd5fd3d4a88054f8de9bae87438e7e9355e Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 18 Oct 2026 08:08:00 +0200 Subject: [PATCH] core: typing and dataclass improvements, start creation of env and csys --- scopes/core/actor.py | 10 +++++++--- scopes/core/core.py | 20 +++++++++++++------- tests/test_core.py | 1 + 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/scopes/core/actor.py b/scopes/core/actor.py index 091e96c..0ef000b 100644 --- a/scopes/core/actor.py +++ b/scopes/core/actor.py @@ -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: diff --git a/scopes/core/core.py b/scopes/core/core.py index 825e537..a3c312d 100644 --- a/scopes/core/core.py +++ b/scopes/core/core.py @@ -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() diff --git a/tests/test_core.py b/tests/test_core.py index 913ff2a..165ac6a 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -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)