Skip to content
This repository was archived by the owner on Oct 7, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions examples/behavior_inheritance_example.py

This file was deleted.

10 changes: 4 additions & 6 deletions examples/complete_statemachine.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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))
Expand All @@ -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())
19 changes: 0 additions & 19 deletions examples/dynamic_machine.py

This file was deleted.

35 changes: 2 additions & 33 deletions examples/initial_state_example.py
Original file line number Diff line number Diff line change
@@ -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
6 changes: 0 additions & 6 deletions examples/pickle_example.py

This file was deleted.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "stateforward"
version = "0.2.3"
version = "0.2.4"
description = ""
authors = ["leonwilly101 <leonwilly101@gmail.com>"]
readme = "README.md"
Expand Down
2 changes: 1 addition & 1 deletion stateforward/model/collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
6 changes: 3 additions & 3 deletions stateforward/model/element.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
8 changes: 5 additions & 3 deletions stateforward/state_machine/functional.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from stateforward import model
from stateforward.elements import elements
import typing
import asyncio


def submachine_state(
Expand All @@ -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)