resource.bend
bendvy-ecs-core@0.1.0.1 · 28 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/deferred_command.bend as Deferred
3import bendvy-ecs-core@0.1.0.1/trace_facts.bend as TraceFacts
4import bendvy-ecs-core@0.1.0.1/world.bend as W
5import bendvy-ecs-core@0.1.0.1/transaction.bend as T
6
7def get_join(~S: Data,~C: Type,~R: Type,~E: Data,~V: Data,observed: W.World<S,C,R,E> & V,undo: List<(W.World<S,C,R,E> -> W.World<S,C,R,E>)>,commands:List<Deferred.Command<W.World<S,C,R,E>>>,events: List<&2,E>,trace:TraceFacts.State) -> T.Tx<W.World<S,C,R,E>,E> & V:
8 (world,value) = observed
9 (T.Tx{world,undo,commands,events,trace},value)
10
11def tx_get(~S: Data,~C: Type,~R: Type,~E: Data,~V: Data,~project: R -> R & V,tx: T.Tx<W.World<S,C,R,E>,E>) -> T.Tx<W.World<S,C,R,E>,E> & V:
12 match tx:
13 case T.Tx{world,undo,commands,events,trace}: get_join(~S,~C,~R,~E,~V,W.observe_resource(~S,~C,~R,~E,~V,~project,world),undo,commands,events,trace)
14
15def restore_join(~S: Data,~C: Type,~R: Type,~E: Data,replaced: W.World<S,C,R,E> & R) -> W.World<S,C,R,E>:
16 (world,discarded) = replaced
17 world
18
19def restore(~S: Data,~C: Type,~R: Type,~E: Data,world: W.World<S,C,R,E>,old: R) -> W.World<S,C,R,E>:
20 restore_join(~S,~C,~R,~E,W.replace_resource(~S,~C,~R,~E,world,old))
21
22def replace_join(~S: Data,~C: Type,~R: Type,~E: Data,replaced: W.World<S,C,R,E> & R,undo: List<(W.World<S,C,R,E> -> W.World<S,C,R,E>)>,commands:List<Deferred.Command<W.World<S,C,R,E>>>,events: List<&2,E>,trace:TraceFacts.State) -> T.Tx<W.World<S,C,R,E>,E>:
23 (world,old) = replaced
24 T.Tx{world,(w => restore(~S,~C,~R,~E,w,old)) <> undo,commands,events,trace}
25
26def tx_replace(~S: Data,~C: Type,~R: Type,~E: Data,tx: T.Tx<W.World<S,C,R,E>,E>,replacement: R) -> T.Tx<W.World<S,C,R,E>,E>:
27 match tx:
28 case T.Tx{world,undo,commands,events,trace}: replace_join(~S,~C,~R,~E,W.replace_resource(~S,~C,~R,~E,world,replacement),undo,commands,events,trace)