1 import Base 2 import ./world.bend as W 3 import ./system.bend as Sys 4 import ./machine.bend as M 5 import ./machine_handlers.bend as H 6 import ./machine_handler_engine.bend as Engine 7 8 # Generic existing handler prepare/commit/retry sequencing; C and R remain affine Type. 9 type Intent is Data: 10 Idle{} 11 BendvyReady{from:V,to:V,skipSame:Bool} 12 InitialReady{to:V} 13 type Owners -> H.Invocation -> Sys.Outcome,String,Unit>> is Type: 14 Owners{handlers:H.Owners,intent:Intent} 15 def published_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,world:State,event:M.Transition) -> State:publish(world,event) 16 17 def requeued_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,to:V,skipSame:Bool,pair:State & M.Slot) -> State: 18 (world,slot)=pair 19 put(world,M.queue(~S,~K,~V,slot,to,skipSame)) 20 21 def committed_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,+from:V,+to:V,pair:State & M.Slot) -> State: 22 (world,slot)=pair 23 published_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,put(world,H.committed(~S,~K,~V,slot,from,to)),M.Transition{from,to}) 24 25 def prepared_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,handlers:H.Owners,world:State,value:H.Prepared) -> Owners & Sys.Outcome: 26 match value: 27 case H.Idle{slot}:(Owners{handlers,Idle{}},Sys.Succeeded{put(world,slot),Unit{}}) 28 case H.BendvyReady{slot,M.Initial{to},_}:(Owners{handlers,InitialReady{to}},Sys.Succeeded{put(world,slot),Unit{}}) 29 case H.BendvyReady{slot,M.Transition{from,to},skipSame}:(Owners{handlers,BendvyReady{from,to,skipSame}},Sys.Succeeded{put(world,slot),Unit{}}) 30 31 def captured_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,handlers:H.Owners,pair:State & M.Slot) -> Owners & Sys.Outcome: 32 (world,+slot)=pair 33 prepared_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,handlers,world,H.prepare(~S,~K,~V,~same,slot,M.snapshot(~S,~K,~V,slot))) 34 35 def apply_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,owners:Owners,world:State) -> Owners & Sys.Outcome: 36 match owners: 37 case Owners{handlers,_}:captured_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,handlers,take(frame(world))) 38 39 def exited_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,transition:List<&1,H.Entry>,enter:List<&1,H.Entry>,+from:V,+to:V,+skipSame:Bool,result:Engine.PhaseResult>) -> Owners & Sys.Outcome: 40 match result: 41 case Engine.Complete{exit,world}:(Owners{H.Owners{exit,transition,enter},BendvyReady{from,to,skipSame}},Sys.Succeeded{world,Unit{}}) 42 case Engine.Failed{exit,world,error}:(Owners{H.Owners{exit,transition,enter},BendvyReady{from,to,skipSame}},Sys.Failed{requeued_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,to,skipSame,take(world)),error}) 43 44 def exit_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,owners:Owners,world:State) -> Owners & Sys.Outcome: 45 match owners: 46 case Owners{handlers,Idle{}}:(Owners{handlers,Idle{}},Sys.Succeeded{world,Unit{}}) 47 case Owners{handlers,InitialReady{to}}:(Owners{handlers,InitialReady{to}},Sys.Succeeded{world,Unit{}}) 48 case Owners{H.Owners{exit,transition,enter},BendvyReady{+from,+to,+skipSame}}:exited_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,transition,enter,from,to,skipSame,Engine.run_phase(~S,~State,~H.Entry,~H.Phase,~V,~invoke,~initial,~H.BendvyExit{},~H.Transition{},~H.Enter{},exit,world,H.BendvyExit{},from,to,None{})) 49 50 def transitioned_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,exit:List<&1,H.Entry>,enter:List<&1,H.Entry>,+from:V,+to:V,+skipSame:Bool,result:Engine.PhaseResult>) -> Owners & Sys.Outcome: 51 match result: 52 case Engine.Complete{transition,world}:(Owners{H.Owners{exit,transition,enter},BendvyReady{from,to,skipSame}},Sys.Succeeded{committed_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,from,to,take(world)),Unit{}}) 53 case Engine.Failed{transition,world,error}:(Owners{H.Owners{exit,transition,enter},BendvyReady{from,to,skipSame}},Sys.Failed{requeued_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,to,skipSame,take(world)),error}) 54 55 def transition_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,owners:Owners,world:State) -> Owners & Sys.Outcome: 56 match owners: 57 case Owners{handlers,Idle{}}:(Owners{handlers,Idle{}},Sys.Succeeded{world,Unit{}}) 58 case Owners{handlers,InitialReady{to}}:(Owners{handlers,InitialReady{to}},Sys.Succeeded{world,Unit{}}) 59 case Owners{H.Owners{exit,transition,enter},BendvyReady{+from,+to,+skipSame}}:transitioned_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,exit,enter,from,to,skipSame,Engine.run_phase(~S,~State,~H.Entry,~H.Phase,~V,~invoke,~initial,~H.BendvyExit{},~H.Transition{},~H.Enter{},transition,world,H.Transition{},from,to,None{})) 60 61 def entered_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,exit:List<&1,H.Entry>,transition:List<&1,H.Entry>,intent:Intent,result:Engine.PhaseResult>) -> Owners & Sys.Outcome: 62 match result: 63 case Engine.Complete{enter,world}:(Owners{H.Owners{exit,transition,enter},intent},Sys.Succeeded{world,Unit{}}) 64 case Engine.Failed{enter,world,error}:(Owners{H.Owners{exit,transition,enter},intent},Sys.Failed{world,error}) 65 66 def enter_with(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~State:Type,~invoke:H.Entry -> State -> H.Phase -> V -> V -> H.Entry & Sys.Outcome,~initial:H.Entry -> State -> V -> H.Entry & Sys.Outcome,~take:State -> State & M.Slot,~put:State -> M.Slot -> State,~publish:State -> M.Transition -> State,~same:V -> V -> Bool,~frame:State -> State,owners:Owners,world:State) -> Owners & Sys.Outcome: 67 match owners: 68 case Owners{handlers,Idle{}}:(Owners{handlers,Idle{}},Sys.Succeeded{world,Unit{}}) 69 case Owners{H.Owners{exit,transition,enter},InitialReady{+to}}:entered_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,exit,transition,InitialReady{to},Engine.run_initial(~S,~State,~H.Entry,~H.Phase,~V,~invoke,~initial,~H.BendvyExit{},~H.Transition{},~H.Enter{},enter,world,to,None{})) 70 case Owners{H.Owners{exit,transition,enter},BendvyReady{+from,+to,+skipSame}}:entered_with(~S,~K,~V,~C,~R,~E,~runner,~State,~invoke,~initial,~take,~put,~publish,~same,~frame,exit,transition,BendvyReady{from,to,skipSame},Engine.run_phase(~S,~State,~H.Entry,~H.Phase,~V,~invoke,~initial,~H.BendvyExit{},~H.Transition{},~H.Enter{},enter,world,H.Enter{},from,to,None{})) 71 72 def engine_result(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,value:H.PhaseResult) -> Engine.PhaseResult,H.Entry>: 73 match value: 74 case H.Complete{entries,world}:Engine.Complete{entries,world} 75 case H.Failed{entries,world,error}:Engine.Failed{entries,world,error} 76 def published(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,world:W.World,event:M.Transition) -> W.World: 77 published_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,world,event) 78 79 def requeued(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,to:V,skipSame:Bool,pair:W.World & M.Slot) -> W.World: 80 requeued_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,to,skipSame,pair) 81 82 def committed(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,+from:V,+to:V,pair:W.World & M.Slot) -> W.World: 83 committed_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,from,to,pair) 84 85 def prepared(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,handlers:H.Owners,world:W.World,value:H.Prepared) -> Owners & Sys.Outcome,String,Unit>: 86 prepared_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,handlers,world,value) 87 88 def captured(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,handlers:H.Owners,pair:W.World & M.Slot) -> Owners & Sys.Outcome,String,Unit>: 89 captured_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,handlers,pair) 90 91 def apply(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,owners:Owners,world:W.World) -> Owners & Sys.Outcome,String,Unit>: 92 apply_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,owners,world) 93 94 def exited(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,transition:List<&1,H.Entry>,enter:List<&1,H.Entry>,+from:V,+to:V,+skipSame:Bool,result:H.PhaseResult) -> Owners & Sys.Outcome,String,Unit>: 95 exited_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,transition,enter,from,to,skipSame,engine_result(~S,~C,~R,~E,~V,~runner,result)) 96 97 def exit(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,owners:Owners,world:W.World) -> Owners & Sys.Outcome,String,Unit>: 98 exit_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,owners,world) 99 100 def transitioned(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,exit:List<&1,H.Entry>,enter:List<&1,H.Entry>,+from:V,+to:V,+skipSame:Bool,result:H.PhaseResult) -> Owners & Sys.Outcome,String,Unit>: 101 transitioned_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,exit,enter,from,to,skipSame,engine_result(~S,~C,~R,~E,~V,~runner,result)) 102 103 def transition(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,owners:Owners,world:W.World) -> Owners & Sys.Outcome,String,Unit>: 104 transition_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,owners,world) 105 106 def entered(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,exit:List<&1,H.Entry>,transition:List<&1,H.Entry>,intent:Intent,result:H.PhaseResult) -> Owners & Sys.Outcome,String,Unit>: 107 entered_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,exit,transition,intent,engine_result(~S,~C,~R,~E,~V,~runner,result)) 108 109 def enter(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~take:W.World -> W.World & M.Slot,~put:W.World -> M.Slot -> W.World,~publish:W.World -> M.Transition -> W.World,~same:V -> V -> Bool,~frame:W.World -> W.World,owners:Owners,world:W.World) -> Owners & Sys.Outcome,String,Unit>: 110 enter_with(~S,~K,~V,~C,~R,~E,~runner,~W.World,~H.invoke_phase(~S,~C,~R,~E,~V,~runner),~H.invoke_initial(~S,~C,~R,~E,~V,~runner),~take,~put,~publish,~same,~frame,owners,world)