execution_save_plan.bend

bendvy-ecs-core@0.1.0.3 · 46 lines · 8 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/execution_composer_layout.bend as Layout
3import bendvy-ecs-core@0.1.0.3/ordinary_declaration.bend as C
4import bendvy-ecs-core@0.1.0.3/persistence_declaration.bend as Decl
5import bendvy-ecs-core@0.1.0.3/schema_fragments.bend as Fragment
6import bendvy-ecs-core@0.1.0.3/decode_data.bend as D
7import bendvy-ecs-core@0.1.0.3/owner_product.bend as Product
8import bendvy-ecs-core@0.1.0.3/execution_resource_policy.bend as Policy
9
10# An ordinary persistence extension determines its canonical storage layout and
11# retained declarations together. A separate route/key catalog is not accepted.
12type Plan is Type:
13  Empty{}
14  Plain{P:Type,V:Data,refresh:P -> P & V,key:String,access:Policy.Policy}
15  Transient{P:Type,V:Data,refresh:P -> P & V,key:String,access:Policy.Policy}
16  Constructed{P:Type,V:Data,refresh:P -> P & V,key:String,project:P -> P & D.Raw,access:Policy.Policy}
17  Pair{left:Plan,right:Plan}
18def layout(plan:Plan) -> Layout.Layout:
19  match plan:
20    case Empty{}:Layout.EmptyLayout{}
21    case Plain{P,V,refresh,key,access}:Layout.ClassifiedLayoutLeaf{P,V,refresh,key,Fragment.Plain{},access}
22    case Transient{P,V,refresh,key,access}:Layout.ClassifiedLayoutLeaf{P,V,refresh,key,Fragment.Transient{},access}
23    case Constructed{P,V,refresh,key,_,access}:Layout.ClassifiedLayoutLeaf{P,V,refresh,key,Fragment.Constructed{},access}
24    case Pair{left,right}:Layout.LayoutPair{layout(left),layout(right)}
25def identity(~S:Data,~P:Type,key:String) -> C.Declaration<S,P>:C.Declaration{key}
26def unused(~P:Type,owner:P) -> P & D.Raw:(owner,D.Missing{})
27def Recipes(~S:Data,plan:Plan) -> Type:
28  match plan:
29    case Empty{}:Unit
30    case Plain{P,_,_,key,_}:Decl.Plain<S,P,identity(~S,~P,key)>
31    case Transient{P,_,_,key,_}:Decl.Transient<S,P,identity(~S,~P,key)>
32    case Constructed{P,_,_,key,project,_}:Decl.Constructed<S,P,identity(~S,~P,key),project>
33    case Pair{left,right}:Product.Owner<Recipes(~S,left),Recipes(~S,right)>
34def first(left:Maybe<&2,String>,right:Maybe<&2,String>) -> Maybe<&2,String>:
35  match left:
36    case Some{key}:Some{key}
37    case None{}:right
38def ineligible(plan:Plan) -> Maybe<&2,String>:
39  match plan:
40    case Empty{}:None{}
41    case Plain{_,_,_,key,_}:Some{key}
42    case Transient{_,_,_,_,_}:None{}
43    case Constructed{_,_,_,_,_,_}:None{}
44    case Pair{left,right}:first(ineligible(left),ineligible(right))
45type Schema<-S:Data,-components:Plan,-resources:Plan> is Type:
46  Schema{components:Recipes(~S,components),resources:Recipes(~S,resources)}