1 import Base 2 import ./dependency_plan.bend as Plan 3 import ./dependency_executor.bend as Exec 4 import ./dependency_registration.bend as Reg 5 import ./dependency_registry_program.bend as Cond 6 7 type Binding is Data:Binding{system:U32,condition:U32} 8 type State is Type: 9 State{world:World,owners:Owners,guards:Guards,handler:Handler,bindings:List<&2,Binding>} 10 type Application<-World:Type,-Owners:Type,-Guards:Type,-Handler:Type,-Error:Data,-Out:Data,-dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),-guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),-handle:Handler -> Error -> Handler & Exec.Handling> is Type: 11 Application{state:State,plan:Plan.Build,bindings:List<&2,Binding>} 12 type Report is Data: 13 Finished{events:List<&2,Exec.Observation>} 14 Stopped{error:Error,events:List<&2,Exec.Observation>} 15 Invalid{reason:Plan.Invalid} 16 17 def binding_selected(selected:Bool,condition:U32,next:Maybe<&2,U32>) -> Maybe<&2,U32>: 18 match selected: 19 case True{}:Some{condition} 20 case False{}:next 21 def lookup(bindings:List<&2,Binding>,+id:U32) -> Maybe<&2,U32>: 22 match bindings: 23 case []:None{} 24 case Binding{system,condition} <> rest:binding_selected(U32.is_eq(system,id),condition,lookup(rest,id)) 25 def binding_duplicate(found:Maybe<&2,U32>,id:U32,next:Maybe<&2,Plan.Invalid>) -> Maybe<&2,Plan.Invalid>: 26 match found: 27 case Some{_}:Some{Plan.Duplicate{id}} 28 case None{}:next 29 def valid_bindings(bindings:List<&2,Binding>,+systems:List<&2,Plan.Node>,+guards:List<&2,Plan.Node>) -> Maybe<&2,Plan.Invalid>: 30 match bindings: 31 case []:None{} 32 case Binding{+system,+condition} <> +rest:Plan.endpoint(~String,Plan.has(~String,systems,system),system,Plan.endpoint(~String,Plan.has(~String,guards,condition),condition,binding_duplicate(lookup(rest,system),system,valid_bindings(rest,systems,guards)))) 33 def checked_bindings(invalid:Maybe<&2,Plan.Invalid>,plan:Plan.Build) -> Plan.Build: 34 match invalid: 35 case Some{reason}:Plan.Rejected{reason} 36 case None{}:plan 37 def checked_guards(guards:Plan.Build,plan:Plan.Build) -> Plan.Build: 38 match guards: 39 case Plan.Rejected{reason}:Plan.Rejected{reason} 40 case Plan.Planned{_,_}:plan 41 42 def guard_condition(~Error:Data,allowed:Bool) -> Exec.Condition: 43 match allowed: 44 case True{}:Exec.Allowed{} 45 case False{}:Exec.Disabled{} 46 47 def dispatched(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,returned:Owners & (World & Exec.Invocation),guards:Guards,handler:Handler,bindings:List<&2,Binding>) -> State & Exec.Invocation: 48 match returned: 49 case (owners,(world,status)):(State{world,owners,guards,handler,bindings},status) 50 def dispatch_state(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,state:State,id:U32) -> State & Exec.Invocation: 51 match state: 52 case State{world,owners,guards,handler,bindings}:dispatched(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle,dispatch(owners,world,id),guards,handler,bindings) 53 def guard_returned(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,returned:Guards & (World & Exec.Invocation),owners:Owners,handler:Handler,bindings:List<&2,Binding>) -> State & Exec.Condition: 54 match returned: 55 case (guards,(world,Exec.Completed{output})):(State{world,owners,guards,handler,bindings},guard_condition(~Error,output)) 56 case (guards,(world,Exec.BodyError{error,_})):(State{world,owners,guards,handler,bindings},Exec.ConditionError{error}) 57 case (guards,(world,Exec.AdmissionRefused{})):(State{world,owners,guards,handler,bindings},Exec.ConditionRefused{}) 58 def guard_selected(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,selected:Maybe<&2,U32>,state:State) -> State & Exec.Condition: 59 match selected state: 60 case None{} state:(state,Exec.Allowed{}) 61 case Some{id} State{world,owners,guards,handler,bindings}:guard_returned(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle,guardDispatch(guards,world,id),owners,handler,bindings) 62 def condition_state(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,state:State,id:U32) -> State & Exec.Condition: 63 match state: 64 case State{world,owners,guards,handler,+bindings}:guard_selected(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle,lookup(bindings,id),State{world,owners,guards,handler,bindings}) 65 def handled(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,returned:Handler & Exec.Handling,world:World,owners:Owners,guards:Guards,bindings:List<&2,Binding>) -> State & Exec.Handling: 66 match returned: 67 case (handler,action):(State{world,owners,guards,handler,bindings},action) 68 def handle_state(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,state:State,error:Error) -> State & Exec.Handling: 69 match state: 70 case State{world,owners,guards,handler,bindings}:handled(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle,handle(handler,error),world,owners,guards,bindings) 71 def returned(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,result:Exec.ExecutionResult,String,Error,Out>,plan:Plan.Build,bindings:List<&2,Binding>) -> Application & Report: 72 match result: 73 case Exec.Finished{state,events}:(Application{state,plan,bindings},Finished{events}) 74 case Exec.Stopped{state,error,events}:(Application{state,plan,bindings},Stopped{error,events}) 75 case Exec.Invalid{state,reason}:(Application{state,plan,bindings},Invalid{reason}) 76 77 # Only declared System owners supply registration identity and access metadata. 78 # Build failure keeps every owner and refuses invocation on subsequent runs. 79 def trusted_build_checked(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,~available:String -> Bool,world:World,systems:Reg.Registry,guards:Reg.ConditionRegistry,handler:Handler,edges:List<&2,Plan.Edge>,+bindings:List<&2,Binding>) -> Application: 80 match systems guards: 81 case Reg.Registry{owners,+nodes} Reg.ConditionRegistry{Reg.Registry{guardOwners,+guardNodes},invalid}:Application{State{world,owners,guardOwners,handler,bindings},checked_guards(checked_bindings(invalid,Plan.build(~String,~available,guardNodes,[])),checked_bindings(valid_bindings(bindings,nodes,guardNodes),Plan.build(~String,~available,nodes,edges))),bindings} 82 def build(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~systemSelection:Cond.Selection(~World,~Owners,~Error,~Out,~dispatch),~guardSelection:Cond.Selection(~World,~Guards,~Error,~Bool,~guardDispatch),~handle:Handler -> Error -> Handler & Exec.Handling,~available:String -> Bool,world:World,systems:Owners,guards:Guards,handler:Handler,edges:List<&2,Plan.Edge>,+bindings:List<&2,Binding>) -> Application: 83 trusted_build_checked(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle,~available,world,Cond.compile(~World,~Owners,~Error,~Out,~dispatch,~systemSelection,systems),Cond.compile_conditions(~World,~Guards,~Error,~guardDispatch,~guardSelection,guards),handler,edges,bindings) 84 def run(~World:Type,~Owners:Type,~Guards:Type,~Handler:Type,~Error:Data,~Out:Data,~dispatch:Owners -> World -> U32 -> Owners & (World & Exec.Invocation),~guardDispatch:Guards -> World -> U32 -> Guards & (World & Exec.Invocation),~handle:Handler -> Error -> Handler & Exec.Handling,app:Application) -> Application & Report: 85 match app: 86 case Application{state,+plan,+bindings}:returned(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle,Exec.run(~State,~String,~Error,~Out,~condition_state(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle),~dispatch_state(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle),~handle_state(~World,~Owners,~Guards,~Handler,~Error,~Out,~dispatch,~guardDispatch,~handle),plan,state),plan,bindings)