ordinary_recovery_system.bend
bendvy-ecs-core@0.1.0.4 · 79 lines · 15 definitions
1import Base
2import bendvy-ecs-core@0.1.0.4/world.bend as W
3import bendvy-ecs-core@0.1.0.4/system.bend as Sys
4import bendvy-ecs-core@0.1.0.4/transaction.bend as T
5import bendvy-ecs-core@0.1.0.4/owner_product.bend as Product
6import bendvy-ecs-core@0.1.0.4/ordinary_recovery_declaration.bend as D
7import bendvy-ecs-core@0.1.0.4/ordinary_recoverable_array_resource.bend as F
8import bendvy-ecs-core@0.1.0.4/recovery_journal.bend as Journal
9
10
11type Request<Args:Type,Capture:Type> is Type:Request{args:Args,capture:Capture}
12
13
14
15type Reply<Capture:Type,Recovery:Type,Error:Data,Out:Type> is Type:Reply{outcome:T.Outcome<Error>,output:Out,capture:Capture,recovery:Recovery}
16
17
18type Owner<Registry:Type,Capture:Type> is Type:Owner{registry:Registry,capture:Capture}
19
20
21
22
23type Run<World:Type,Owner:Type,Args:Type,Error:Data,Out:Type,Recovery:Type> is Type:
24 Completed{world:World,owner:Owner,outcome:T.Outcome<Error>,output:Out,recovery:Recovery}
25 RegistrationRejected{world:World,owner:Owner,args:Args}
26 TransportFailed{world:World}
27
28
29type Defined<World:Type,Owner:Type,Capture:Type> is Type:
30 Defined{world:World,owner:Owner}
31 DefinitionRejected{world:World,capture:Capture}
32def finished(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),outcome:T.Outcome<Error>,output:Out,result:Product.Owner<W.World<S,C,R,E>,Capture> & Recovery) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Capture,Recovery,Error,Out>>:
33 match result:
34 case (Product.Owner{world,capture},recovery):Sys.Succeeded{world,Reply{outcome,output,capture,recovery}}
35def completing(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),state:Product.Owner<W.World<S,C,R,E>,Capture>,journal:List<Journal.Action(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery)>,result:T.Outcome<Error> & Out) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Capture,Recovery,Error,Out>>:
36 match result:
37 case (+outcome,output):finished(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body,outcome,output,Journal.finish(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,journal,F.succeeded(~Error,outcome),state,D.empty(~S,~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops,~builder,declaration)(Unit{})))
38def returned(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),result:F.Frame<Product.Owner<W.World<S,C,R,E>,Capture>,Recovery> & (T.Outcome<Error> & Out)) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Capture,Recovery,Error,Out>>:
39 match result:
40 case (F.Frame{state,journal},result):completing(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body,state,journal,result)
41
42
43
44
45def runner(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),world:W.World<S,C,R,E>,request:Request<Args,Capture>) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Capture,Recovery,Error,Out>>:
46 match request:
47 case Request{args,capture}:returned(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body,body(F.Frame<Product.Owner<W.World<S,C,R,E>,Capture>,Recovery>,D.root_grant(~S,~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops,~builder),args,F.Frame{Product.Owner{world,capture},[]}))
48
49
50def Owned(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out)) -> Type:Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>
51def registered(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),capture:Capture,result:Sys.RegistrationResult<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>) -> Defined<W.World<S,C,R,E>,Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>,Capture>:
52 match result:
53 case Sys.Registered{world,registry}:Defined{world,Owner{registry,capture}}
54 case Sys.RegistrationFailed{world}:DefinitionRejected{world,capture}
55
56
57
58
59def define(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),world:W.World<S,C,R,E>,name:String,capture:Capture) -> Defined<W.World<S,C,R,E>,Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>,Capture>:
60 registered(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body,capture,Sys.register(~S,~C,~R,~E,~Request<Args,Capture>,~Unit,~Reply<Capture,Recovery,Error,Out>,~runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body),world,name,D.access(~S,~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops,~builder,declaration)))
61
62
63def done(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),outcome:T.Outcome<Error>,output:Out,capture:Capture,recovery:Recovery,result:W.World<S,C,R,E> & Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>) -> Run<W.World<S,C,R,E>,Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>,Args,Error,Out,Recovery>:
64 match result:
65 case (world,registry):Completed{world,Owner{registry,capture},outcome,output,recovery}
66def completed(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),result:Sys.RunResult<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>) -> Run<W.World<S,C,R,E>,Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>,Args,Error,Out,Recovery>:
67 match result:
68 case Sys.RegistrationRejected{registry,world,Request{args,capture}}:RegistrationRejected{world,Owner{registry,capture},args}
69 case Sys.Completed{registry,Sys.Succeeded{world,Reply{+outcome,output,capture,recovery}}}:done(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body,outcome,output,capture,recovery,(world,registry))
70
71 case Sys.Completed{_,Sys.Failed{world,_}}:TransportFailed{world}
72
73
74
75
76
77def run(~S:Data,~C:Type,~R:Type,~E:Data,~Capture:Type,~Recovery:Type,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~builder:D.Builder(~Product.Owner<W.World<S,C,R,E>,Capture>,~Recovery,~Ops),~declaration:D.Declaration<S,Product.Owner<W.World<S,C,R,E>,Capture>,Recovery,Ops,builder>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome<Error> & Out),owner:Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>,world:W.World<S,C,R,E>,args:Args) -> Run<W.World<S,C,R,E>,Owner<Sys.Registry<S,C,R,E,Request<Args,Capture>,Unit,Reply<Capture,Recovery,Error,Out>,runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body)>,Capture>,Args,Error,Out,Recovery>:
78 match owner:
79 case Owner{registry,capture}:completed(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body,Sys.run(~S,~C,~R,~E,~Request<Args,Capture>,~Unit,~Reply<Capture,Recovery,Error,Out>,~runner(~S,~C,~R,~E,~Capture,~Recovery,~Ops,~Args,~Error,~Out,~builder,~declaration,~body),registry,world,Request{args,capture}))