From effd9cf412f5e4bccb680d15a1d3bd8e689346dc Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 20 Oct 2026 09:29:08 +0200 Subject: [PATCH] core: gen_program, using ProgramSpec dict with (cat, stage) as key --- scopes/core/core.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scopes/core/core.py b/scopes/core/core.py index 027491b..dd0bf96 100644 --- a/scopes/core/core.py +++ b/scopes/core/core.py @@ -18,6 +18,7 @@ type Categ = tuple[Symbol, Symbol] type Proc = Callable[[Message, Scope], Awaitable[Scope | None]] type Program = Callable[[Scope], Proc] type Syn = Callable[[Message], Message] +type ProgramSpec = dict[tuple[Symbol, Symbol], Proc] type Handler = Callable[[Message, Scope], Awaitable[Message | None | tuple[Message | None, Scope | None]]] @@ -29,6 +30,15 @@ async def proc_dummy(msg: Message, scope: Scope) -> None: global_mailbox: Mailbox = asyncio.Queue() +def gen_program(spec: ProgramSpec, default: Proc = proc_dummy) -> Program: + def program(scope: Scope) -> Proc: + key = (scope.categ[1], scope.stage) + proc = spec.get(key, spec.get((key[0], k.default))) + if proc is None: + proc = spec.get((k.default, key[1]), default) + return proc + return program + @dataclass class Scope: @@ -36,7 +46,7 @@ class Scope: categ: Categ = (k.csys, k.c00) stage: Symbol = k.initial proc: Proc = field(init=False) - program: Program = lambda x: proc_dummy + program: Program = gen_program({}) syns: list[Syn] = field(default_factory=list) environ: Mailbox = global_mailbox