1 import Base 2 import ./world.bend as W 3 import ./ordinary_app_relation.bend as Relation 4 import ./relation_failure_reader.bend as Ord 5 import ./relation_commands.bend as A 6 import ./relation_providers.bend as P 7 import ./transaction.bend as T 8 import ./commands.bend as Cmd 9 import ./system.bend as Sys 10 import ./ordinary_app_observation_data.bend as DTO 11 import ./ordinary_app_registration_fields.bend as Fields 12 import ./schedule.bend as Sch 13 14 def finished(~S:Data,~C:Type,~R:Type,~E:Data,result:T.Returned) -> Sys.Outcome: 15 match result: 16 case T.Returned{world,T.Success{}}:Sys.Succeeded{world,Unit{}} 17 case T.Returned{world,T.Failure{error}}:Sys.Failed{world,error} 18 def read_done(~S:Data,~C:Type,~R:Type,~E:Data,result:T.Tx> & Maybe<&2,List<&2,W.Handle>>) -> Sys.Outcome: 19 match result: 20 case (frame,_):finished(~S,~C,~R,~E,Cmd.tx_finish(~S,~A.Store,~R,~A.Notice,~Unit,frame,T.Success{})) 21 def reader(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,world:Relation.World(~S,~C,~R,~E),args:Unit) -> Sys.Outcome: 22 read_done(~S,~C,~R,~E,P.read(~T.Tx>,~S,~P.provide_read(~S,~C,~R,~E,~Relation.descriptor(~S,declaration)),T.begin(~Relation.World(~S,~C,~R,~E),~A.Notice,world),target)) 23 def Owner(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle) -> Type: 24 Sys.Registry,R,A.Notice,Unit,Unit,Unit,reader(~S,~C,~R,~E,~declaration,~target)> 25 def register(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,world:Relation.World(~S,~C,~R,~E),name:String) -> Sys.RegistrationResult,R,A.Notice,Unit,Unit,Unit,reader(~S,~C,~R,~E,~declaration,~target)>: 26 Sys.register(~S,~A.Store,~R,~A.Notice,~Unit,~Unit,~Unit,~reader(~S,~C,~R,~E,~declaration,~target),world,name,Ord.accesses(~S,[declaration])) 27 def empty_fold(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,owner:Owner(~S,~C,~R,~E,~declaration,~target)) -> Owner(~S,~C,~R,~E,~declaration,~target) & List<&2,Fields.Fields>: 28 (owner,[]) 29 def binding(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,owner:Owner(~S,~C,~R,~E,~declaration,~target),slot:String) -> Owner(~S,~C,~R,~E,~declaration,~target) & DTO.Binding: 30 match owner: 31 case Sys.Registry{+namespace,+id,+name,+access,+cursor}:(Sys.Registry{namespace,id,name,access,cursor},DTO.Binding{namespace,id,name,access,cursor,slot,[]}) 32 def dispatched(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,result:Sys.RunResult,R,A.Notice,Unit,Unit,Unit,reader(~S,~C,~R,~E,~declaration,~target)>) -> Owner(~S,~C,~R,~E,~declaration,~target) & Sys.Outcome,Unit>: 33 match result: 34 case Sys.Completed{registry,Sys.Succeeded{world,output}}:(registry,Sys.Succeeded{world,output}) 35 case Sys.Completed{registry,Sys.Failed{world,error}}:(registry,Sys.Failed{world,Some{error}}) 36 case Sys.RegistrationRejected{registry,world,args}:(registry,Sys.Failed{world,None{}}) 37 def dispatch_checked(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,allowed:Bool,owner:Owner(~S,~C,~R,~E,~declaration,~target),world:Relation.World(~S,~C,~R,~E)) -> Owner(~S,~C,~R,~E,~declaration,~target) & Sys.Outcome,Unit>: 38 match allowed: 39 case False{}:(owner,Sys.Failed{world,None{}}) 40 case True{}:dispatched(~S,~C,~R,~E,~declaration,~target,Sys.run(~S,~A.Store,~R,~A.Notice,~Unit,~Unit,~Unit,~reader(~S,~C,~R,~E,~declaration,~target),owner,world,Unit{})) 41 def dispatch(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,owner:Owner(~S,~C,~R,~E,~declaration,~target),world:Relation.World(~S,~C,~R,~E),id:U32) -> Owner(~S,~C,~R,~E,~declaration,~target) & Sys.Outcome,Unit>: 42 match owner: 43 case Sys.Registry{namespace,+actual,name,access,cursor}:dispatch_checked(~S,~C,~R,~E,~declaration,~target,U32.is_eq(actual,id),Sys.Registry{namespace,actual,name,access,cursor},world)