Context-aware Flipper
The previous Flipper example stores all values in logic state — a central location that requires sequential access.
With a million users flipping values, each must wait for the previous one to finish.
Actor State: Parallel Execution
MOI solves this by moving data from logic state to actor context. Each actor (user or logic) stores their own value, enabling parallel execution.
A million actors can flip their values simultaneously.
tip
Read more about state in Logic and Actor State.
Modified Code
Create context_flipper.coco:
context_flipper.coco
coco ContextFlipper
state actor:
value Bool
endpoint enlist Init():
mutate true -> ContextFlipper.Sender.value
endpoint dynamic Flip():
mutate value <- ContextFlipper.Sender.value:
value = !value
endpoint static Mode() -> (value Bool):
observe value <- ContextFlipper.Sender.value
endpoint dynamic Set(value Bool):
mutate value -> ContextFlipper.Sender.value
Key differences:
state actorinstead ofstate logicendpoint enlistto initialize actor state (one-time, likedeployfor logic)- Access via
Senderinstead ofLogic
Test the Code
coco compile
coco lab init
Enlist and Test
Use enlist once to initialize actor state (similar to how deploy initializes logic state):
# Enlist the sender
enlist ContextFlipper.Init()
# Check value
observe ContextFlipper.Sender.value
# → true
Multiple Ways to Observe
All these return the same value:
observe ContextFlipper.Sender.value
observe ContextFlipper.default_user.value
observe ContextFlipper.<identifier>.value
Test with Another User
register Robert
set default.sender Robert
# Enlist Robert
enlist ContextFlipper.Init()
# Each actor has their own value
observe ContextFlipper.Robert.value # → true
observe ContextFlipper.default_user.value # → still true (unchanged)
# Flip Robert's value
invoke ContextFlipper.Flip()
observe ContextFlipper.Robert.value # → false
observe ContextFlipper.default_user.value # → still true
Actor context is the foundation of parallel execution in MOI.