execution_trace.bend
bendvy-ecs-core@0.1.0.4 · 80 lines · 12 definitions
1import Base
2import bendvy-ecs-core@0.1.0.4/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.4/trace_facts.bend as Facts
4
5
6
7
8type Identity is Data:
9 Identity{namespace:U32,id:U32,name:Maybe<&2,String>}
10
11type Status<Error:Data> is Data:
12 SystemOk{}
13 SystemError{error:Error}
14
15
16type Completion<Error:Data> is Data:
17 EndOk{}
18 EndFailed{error:Error}
19 EndRejected{}
20 EndMissing{}
21
22
23
24type TraceEvent<Error:Data> is Data:
25 ScheduleStarted{namespace:U32,name:String}
26 PhaseEntered{name:String}
27 SystemCompleted{identity:Identity,before:Tick.Tick,after:Tick.Tick,status:Status<Error>}
28 OperationObserved{identity:Identity,fact:Facts.Fact}
29 BarrierOperationObserved{fact:Facts.Fact}
30 ExecutionOperationObserved{fact:Facts.Fact}
31 SystemSkipped{id:U32}
32 DeferredApplied{}
33 ScheduleEnded{outcome:Completion<Error>}
34 ScheduleAdmissionRefused{namespace:U32,name:String,outcome:Completion<Error>}
35
36
37
38type Batch<Error:Data> is Data:
39 Disabled{}
40 BendvyReady{events:List<&2,TraceEvent<Error>>}
41
42
43
44type Subscriber<State:Type,Error:Data,-step:State -> TraceEvent<Error> -> State> is Type:
45 Subscriber{state:State}
46
47
48def subscribe(~State:Type,~Error:Data,~step:State -> TraceEvent<Error> -> State,state:State) -> Subscriber<State,Error,step>:
49 Subscriber{state}
50
51
52def unsubscribe(~State:Type,~Error:Data,~step:State -> TraceEvent<Error> -> State,value:Subscriber<State,Error,step>) -> State:
53 match value:
54 case Subscriber{state}:state
55
56
57def reset(~State:Type,~Error:Data,~step:State -> TraceEvent<Error> -> State,value:Subscriber<State,Error,step>,incoming:State) -> Subscriber<State,Error,step> & State:
58 match value:
59 case Subscriber{state}:(Subscriber{incoming},state)
60def delivered(~State:Type,~Error:Data,~step:State -> TraceEvent<Error> -> State,events:List<&2,TraceEvent<Error>>,state:State) -> State:
61 match events:
62 case []:state
63 case event <> rest:delivered(~State,~Error,~step,rest,step(state,event))
64
65
66
67
68def deliver(~State:Type,~Error:Data,~step:State -> TraceEvent<Error> -> State,value:Subscriber<State,Error,step>,batch:Batch<Error>) -> Subscriber<State,Error,step>:
69 match value batch:
70 case subscriber Disabled{}:subscriber
71 case Subscriber{state} BendvyReady{events}:Subscriber{delivered(~State,~Error,~step,events,state)}
72
73
74
75
76
77
78def both(~Left:Type,~Right:Type,~Error:Data,~left:Left -> Batch<Error> -> Left,~right:Right -> Batch<Error> -> Right,value:Left & Right,+batch:Batch<Error>) -> Left & Right:
79 match value:
80 case (first,second):(left(first,batch),right(second,batch))