machine_handler_trace.bend
bendvy-ecs-core@0.1.0.0 · 35 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/world.bend as W
3import bendvy-ecs-core@0.1.0.0/system.bend as Sys
4import bendvy-ecs-core@0.1.0.0/machine_handlers.bend as H
5import bendvy-ecs-core@0.1.0.0/machine_handler_bundle.bend as B
6import bendvy-ecs-core@0.1.0.0/ordinary_machine_handler_bundle.bend as Classic
7import bendvy-ecs-core@0.1.0.0/ordinary_machine_handler_bundle_context.bend as Context
8import bendvy-ecs-core@0.1.0.0/execution_trace.bend as Trace
9import bendvy-ecs-core@0.1.0.0/trace_facts.bend as Facts
10
11def observed(fact:Facts.Fact,barrier:Bool,identity:Maybe<&2,Trace.Identity>) -> Trace.TraceEvent<String>:
12 match barrier identity:
13 case True{} _:Trace.BarrierOperationObserved{fact}
14 case False{} Some{identity}:Trace.OperationObserved{identity,fact}
15 case False{} None{}:Trace.ExecutionOperationObserved{fact}
16def events(items:List<&2,Facts.Fact>,+barrier:Bool,+identity:Maybe<&2,Trace.Identity>) -> List<&2,Trace.TraceEvent<String>>:
17 match items:
18 case []:[]
19 case Facts.BoundaryFact{Facts.PhaseBoundary{name}} <> rest:Trace.PhaseEntered{name} <> events(rest,False{},None{})
20 case Facts.BoundaryFact{Facts.BarrierEntered{}} <> rest:events(rest,True{},None{})
21 case Facts.BoundaryFact{Facts.BarrierFinished{}} <> rest:Trace.DeferredApplied{} <> events(rest,False{},None{})
22 case Facts.HandlerFact{+namespace,+id,+name,ordinal,phase,from,to,result} <> rest:Trace.ExecutionOperationObserved{Facts.HandlerFact{namespace,id,name,ordinal,phase,from,to,result}} <> events(rest,barrier,Some{Trace.Identity{namespace,id,Some{name}}})
23 case Facts.ReaderFact{+namespace,+id,+name,readerId,domain,lagged} <> rest:Trace.OperationObserved{Trace.Identity{namespace,id,Some{name}},Facts.ReaderFact{namespace,id,name,readerId,domain,lagged}} <> events(rest,barrier,identity)
24 case fact <> rest:observed(fact,barrier,identity) <> events(rest,barrier,identity)
25def named(~Q:Data,namespace:U32,name:String,status:B.Status<Q>,facts:List<&2,Facts.Fact>) -> Trace.Batch<String>:
26 match status:
27 case B.ForeignBundle{}:Trace.Ready{[Trace.ScheduleAdmissionRefused{namespace,name,Trace.EndRejected{}}]}
28 case B.MissingRequirements{_}:Trace.Ready{[Trace.ScheduleAdmissionRefused{namespace,name,Trace.EndMissing{}}]}
29 case B.HandlerFailed{_,error}:Trace.Ready{Trace.ScheduleStarted{namespace,name} <> List.append(&2,Trace.TraceEvent<String>,events(facts,False{},None{}),[Trace.ScheduleEnded{Trace.EndFailed{error}}])}
30 case _:Trace.Ready{Trace.ScheduleStarted{namespace,name} <> List.append(&2,Trace.TraceEvent<String>,events(facts,False{},None{}),[Trace.ScheduleEnded{Trace.EndOk{}}])}
31def captured(~S:Data,~K:Data,~V:Data,~Q:Data,~C:Type,~R:Type,~E:Data,~runner:W.World<S,C,R,E> -> H.Invocation<V> -> Sys.Outcome<W.World<S,C,R,E>,String,Unit>,name:String,value:Context.MarkerResult<S,K,V,Q,C,R,E,runner>) -> Classic.MarkerResult<S,K,V,Q,C,R,E,runner> & Trace.Batch<String>:
32 match value:
33 case Context.MarkerResult{result,steps,observations,Facts.Off{}}:(Classic.MarkerResult{result,steps,observations},Trace.Disabled{})
34 case Context.MarkerResult{B.Returned{B.Bundle{+namespace,entries},world,+status},steps,observations,Facts.On{facts}}:(Classic.MarkerResult{B.Returned{B.Bundle{namespace,entries},world,status},steps,observations},named(~Q,namespace,name,status,List.reverse(&2,Facts.Fact,facts)))
35 case Context.MarkerResult{B.InternalOwnerRemainder{+namespace,recovery,world,+status},steps,observations,Facts.On{facts}}:(Classic.MarkerResult{B.InternalOwnerRemainder{namespace,recovery,world,status},steps,observations},named(~Q,namespace,name,status,List.reverse(&2,Facts.Fact,facts)))