diff --git a/scopes/core/core.py b/scopes/core/core.py index d7be117..a428cb1 100644 --- a/scopes/core/core.py +++ b/scopes/core/core.py @@ -95,9 +95,17 @@ class Scope: def create_scope(env: Mailbox, cat: Categ = (k.csys, k.c00), **kw) -> Scope: return Scope(environ=env, categ=cat, **kw) -def create_zero(env: Mailbox) -> Mailbox: - scope = create_scope(env) +def clone_scope(scope: Scope, **kw) -> Scope: + value = kw.get('value', 0) + categ = kw.get('categ', scope.categ) + stage = kw.get('stage', k.initial) + return Scope(environ=scope.environ, value=value, categ=categ, stage=stage, + program=scope.program, syns=[], **kw) + +async def create_zero(env: Mailbox) -> Mailbox: + scope = create_scope(env, program=gen_program({}, default=std_proc())) zero = neuron(scope) + await notify_created(Message(k.csys), zero, scope) return zero # predefined action handlers and Action sets @@ -115,6 +123,8 @@ def value_add() -> Handler: def create() -> Handler: async def handle(msg, scope) -> None: + new = neuron(clone_scope(scope, **msg.data)) + await notify_created(msg, new, scope) return None return handle @@ -127,8 +137,15 @@ def basic_actions() -> Actions: # predefined specialized procs -def std_proc(actions: Actions | None = None, finalize=forward(), **more) -> Proc: +def std_proc(actions: Actions | None = None, finalize: Handler = forward(), + more: Actions = {}) -> Proc: if actions is None: - actions = basic_actions() | util.keyword_dict(more) + actions = basic_actions() | more return gen_proc(actions, finalize=finalize) +# helpers + +async def notify_created(msg: Message, new: Mailbox, scope: Scope) -> None: + msg = Message(msg.head['domain'], k.created, data=msg.data | {k.new: new}) + await scope.environ.put(msg) + diff --git a/scopes/util.py b/scopes/util.py index f08e008..f0bc861 100644 --- a/scopes/util.py +++ b/scopes/util.py @@ -25,9 +25,6 @@ class Symbols: keywords = Symbols() -def keyword_dict(d): - return dict((keywords(key), val) for key, val in d.items()) - # list / iterable utilities def flatten(*it, ignore_none=False): diff --git a/tests/test_core.py b/tests/test_core.py index 2e01ed5..efdd993 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -67,12 +67,15 @@ async def meta_env(collector): @pytest.mark.anyio async def test_core(meta_env, collector): env = environ.create(meta_env) - zero = core.create_zero(env) + zero = await core.create_zero(env) await env.put(Message(k.env, k.hello)) await zero.put(Message(k.csys, k.hello)) + await zero.put(Message(k.csys, k.create)) await asyncio.sleep(0.01) - assert len(collector) == 2 - assert collector[0].domain is k.env - assert collector[1].domain is k.csys + assert len(collector) == 4 + assert collector[0].action is k.created + assert collector[1].domain is k.env + assert collector[2].domain is k.csys + assert collector[3].action is k.created #print(collector) diff --git a/tests/test_util.py b/tests/test_util.py index c085f8c..f2b6ee1 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -4,7 +4,7 @@ import pytest -from scopes.util import keywords as k, keyword_dict, flatten +from scopes.util import keywords as k, flatten def test_keywords(): assert k.dummy is k.dummy @@ -12,7 +12,6 @@ def test_keywords(): assert getattr(k, "abcd"[-2:]) is k.cd assert k('dummy') is k.dummy assert k('new') is k('new') - assert keyword_dict(dict(one=1, two=2)) == {k.one: 1, k.two: 2} def test_flatten(): lst = (1, (None, 2), (3, (4, 5)))