machine_handler_trace.bend

bendvy-ecs-core@0.1.0.1 · 35 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.1/world.bend as W
3import bendvy-ecs-core@0.1.0.1/system.bend as Sys
4import bendvy-ecs-core@0.1.0.1/machine_handlers.bend as H
5import bendvy-ecs-core@0.1.0.1/machine_handler_bundle.bend as B
6import bendvy-ecs-core@0.1.0.1/ordinary_machine_handler_bundle.bend as Classic
7import bendvy-ecs-core@0.1.0.1/ordinary_machine_handler_bundle_context.bend as Context
8import bendvy-ecs-core@0.1.0.1/execution_trace.bend as Trace
9import bendvy-ecs-core@0.1.0.1/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.BendvyReady{[Trace.ScheduleAdmissionRefused{namespace,name,Trace.EndRejected{}}]}
28    case B.MissingRequirements{_}:Trace.BendvyReady{[Trace.ScheduleAdmissionRefused{namespace,name,Trace.EndMissing{}}]}
29    case B.HandlerFailed{_,error}:Trace.BendvyReady{Trace.ScheduleStarted{namespace,name} <> List.append(&2,Trace.TraceEvent<String>,events(facts,False{},None{}),[Trace.ScheduleEnded{Trace.EndFailed{error}}])}
30    case _:Trace.BendvyReady{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)))