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_phases.bend as Phase 7 import ./machine_handler_context.bend as Handler 8 import ./execution_context.bend as Ctx 9 import ./trace_facts.bend as Facts 10 11 def framed(~S:Data,~C:Type,~R:Type,~E:Data,~frame:W.World -> W.World,context:Ctx.Context>) -> Ctx.Context>: 12 match context: 13 case Ctx.Context{world,trace}:Ctx.Context{frame(world),trace} 14 def apply(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~observed:Facts.State -> W.World -> H.Invocation -> Sys.Outcome,String,Unit> & Facts.State,~name:String,~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:Phase.Owners,world:Ctx.Context>) -> Phase.Owners & Sys.Outcome>,String,Unit>: 15 Phase.apply_with(~S,~K,~V,~C,~R,~E,~runner,~Ctx.Context>,~Handler.invoke(~S,~C,~R,~E,~V,~runner,~observed),~Handler.initial(~S,~C,~R,~E,~V,~runner,~observed),~Handler.context_take(~S,~C,~R,~E,~V,~runner,~K,~take),~Handler.context_put(~S,~C,~R,~E,~V,~runner,~K,~put),~Handler.context_publish(~S,~C,~R,~E,~V,~runner,~publish,~name),~same,~framed(~S,~C,~R,~E,~frame),owners,world) 16 def exit(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~observed:Facts.State -> W.World -> H.Invocation -> Sys.Outcome,String,Unit> & Facts.State,~name:String,~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:Phase.Owners,world:Ctx.Context>) -> Phase.Owners & Sys.Outcome>,String,Unit>: 17 Phase.exit_with(~S,~K,~V,~C,~R,~E,~runner,~Ctx.Context>,~Handler.invoke(~S,~C,~R,~E,~V,~runner,~observed),~Handler.initial(~S,~C,~R,~E,~V,~runner,~observed),~Handler.context_take(~S,~C,~R,~E,~V,~runner,~K,~take),~Handler.context_put(~S,~C,~R,~E,~V,~runner,~K,~put),~Handler.context_publish(~S,~C,~R,~E,~V,~runner,~publish,~name),~same,~framed(~S,~C,~R,~E,~frame),owners,world) 18 def transition(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~observed:Facts.State -> W.World -> H.Invocation -> Sys.Outcome,String,Unit> & Facts.State,~name:String,~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:Phase.Owners,world:Ctx.Context>) -> Phase.Owners & Sys.Outcome>,String,Unit>: 19 Phase.transition_with(~S,~K,~V,~C,~R,~E,~runner,~Ctx.Context>,~Handler.invoke(~S,~C,~R,~E,~V,~runner,~observed),~Handler.initial(~S,~C,~R,~E,~V,~runner,~observed),~Handler.context_take(~S,~C,~R,~E,~V,~runner,~K,~take),~Handler.context_put(~S,~C,~R,~E,~V,~runner,~K,~put),~Handler.context_publish(~S,~C,~R,~E,~V,~runner,~publish,~name),~same,~framed(~S,~C,~R,~E,~frame),owners,world) 20 def enter(~S:Data,~K:Data,~V:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,~observed:Facts.State -> W.World -> H.Invocation -> Sys.Outcome,String,Unit> & Facts.State,~name:String,~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:Phase.Owners,world:Ctx.Context>) -> Phase.Owners & Sys.Outcome>,String,Unit>: 21 Phase.enter_with(~S,~K,~V,~C,~R,~E,~runner,~Ctx.Context>,~Handler.invoke(~S,~C,~R,~E,~V,~runner,~observed),~Handler.initial(~S,~C,~R,~E,~V,~runner,~observed),~Handler.context_take(~S,~C,~R,~E,~V,~runner,~K,~take),~Handler.context_put(~S,~C,~R,~E,~V,~runner,~K,~put),~Handler.context_publish(~S,~C,~R,~E,~V,~runner,~publish,~name),~same,~framed(~S,~C,~R,~E,~frame),owners,world)