diff --git a/examples/behavior_inheritance_example.py b/examples/behavior_inheritance_example.py deleted file mode 100644 index c177437..0000000 --- a/examples/behavior_inheritance_example.py +++ /dev/null @@ -1,11 +0,0 @@ -import stateforward as sf - - -class Print(sf.Behavior): - def activity(self, event: sf.Event): - print(f"{self.qualified_name} -> {event.qualified_name}") - - -class AsyncPrint(sf.Behavior): - async def activity(self, event: sf.Event): - print(f"{self.qualified_name} -> {event.qualified_name}") diff --git a/examples/complete_statemachine.py b/examples/complete_statemachine.py index b4b314c..c42a397 100644 --- a/examples/complete_statemachine.py +++ b/examples/complete_statemachine.py @@ -13,7 +13,7 @@ class e2(sf.Event): e3 = sf.event("e3") -class Sample(sf.AsyncStateMachine): +class SampleMachine(sf.AsyncStateMachine): class s2(sf.State): class r1(sf.Region): class s1(sf.State): @@ -71,7 +71,7 @@ class CompleteSM(sf.AsyncStateMachine): # sf.when(lambda self: self.model.a1), source=r2.s1, target=r2.s2 # ) - s2 = sf.submachine_state(Sample, name="s2") + s2 = sf.submachine_state(SampleMachine) initial = sf.initial(s0) # s0_fork = sf.fork(sf.transition(target=s1.r1.s1), sf.transition(target=s1.r2.s2)) @@ -89,12 +89,10 @@ class CompleteSM(sf.AsyncStateMachine): import asyncio async def main(): - # sf.dump(CompleteSM) sm = CompleteSM() # # - await sm.__interpreter__.start() - # print(sm.state) + await sm.interpreter.start() await sf.send(e3(), sm) - print(sm.state) + # print(sm.state) asyncio.run(main()) diff --git a/examples/dynamic_machine.py b/examples/dynamic_machine.py deleted file mode 100644 index a901589..0000000 --- a/examples/dynamic_machine.py +++ /dev/null @@ -1,19 +0,0 @@ -import stateforward as sf - - -def create_sm(regions: int): - class SM(sf.AsyncStateMachine): - for x in range(regions): - exec( - f"""class r{x}(sf.Region): - class s1(sf.State): - pass - initial = sf.initial(s1) - """ - ) - - print("here", SM.r0.initial) - return SM - - -sf.dump(create_sm(1)) diff --git a/examples/initial_state_example.py b/examples/initial_state_example.py index b692509..1f7fab8 100644 --- a/examples/initial_state_example.py +++ b/examples/initial_state_example.py @@ -1,36 +1,5 @@ import stateforward as sf -import asyncio -def make_region(initial_state: str = "S1"): - class R(sf.Region): - class S1(sf.State): - pass - - class S2(sf.State): - pass - - class S3(sf.State): - pass - - initial = sf.initial( - S1 if initial_state == "S1" else S2 if initial_state == "S2" else S3 - ) - - return R - - -class SM(sf.AsyncStateMachine): - R1 = make_region() - R2 = make_region("S2") - R3 = make_region("S3") - - -async def main(): - sf.dump(SM) - sm = SM() - await sm.__interpreter__.start() - assert sm.state == (sm.R1.S1, sm.R2.S2, sm.R3.S3) - - -asyncio.run(main()) +class A(sf.Event): + pass diff --git a/examples/pickle_example.py b/examples/pickle_example.py deleted file mode 100644 index 5181c70..0000000 --- a/examples/pickle_example.py +++ /dev/null @@ -1,6 +0,0 @@ -from examples.light_switch import LightSwitch -from examples.element_example import Family -import pickle - -tree = LightSwitch() -pickle.dumps(tree) diff --git a/pyproject.toml b/pyproject.toml index 7f17053..73dceff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "stateforward" -version = "0.2.3" +version = "0.2.4" description = "" authors = ["leonwilly101 "] readme = "README.md" diff --git a/stateforward/model/collection.py b/stateforward/model/collection.py index 7cda5bb..b13ddb3 100644 --- a/stateforward/model/collection.py +++ b/stateforward/model/collection.py @@ -15,7 +15,7 @@ def is_collection(value: typing.Any) -> bool: def collection(*elements: ElementType) -> type["Collection"]: new_collection = type( - "Collection", + "collection", (Collection,), { "length": len(elements), diff --git a/stateforward/model/element.py b/stateforward/model/element.py index f77a8bc..112155b 100644 --- a/stateforward/model/element.py +++ b/stateforward/model/element.py @@ -428,12 +428,12 @@ def specialize(base: ElementType, derived: ElementType, **kwargs): ) for index, element in enumerate(base_elements): + new_element = new_elements[index] for name, element_id in element.__associations__.items(): - new_element = new_elements[index] - associated_element = new_element.__associations__[name] = element_map[ + associated_id = new_element.__associations__[name] = element_map[ element_id ] - setattr(new_element, name, associated_element) + setattr(new_element, name, new_element.__all_elements__[associated_id]) return None diff --git a/stateforward/state_machine/functional.py b/stateforward/state_machine/functional.py index 62c68bb..5122d2d 100644 --- a/stateforward/state_machine/functional.py +++ b/stateforward/state_machine/functional.py @@ -1,6 +1,7 @@ from stateforward import model from stateforward.elements import elements import typing +import asyncio def submachine_state( @@ -27,9 +28,10 @@ def send( ) -> typing.Union[typing.Awaitable, list[typing.Awaitable]]: if element is None: return [ - model.of(element).interpreter.send(event) - for element in model.all_instances().values() - ] + model.of(element).interpreter.send(event) + for element in model.all_instances().values() + ] + if isinstance(element, str): element = model.all_instances()[element] return model.of(element).interpreter.send(event)