snapshot_leaf.bend

bendvy-ecs-core@0.1.0.0 · 46 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.0/persistence_declaration.bend as Decl
3import bendvy-ecs-core@0.1.0.0/snapshot_gate.bend as Gate
4import bendvy-ecs-core@0.1.0.0/decode_data.bend as D
5import bendvy-ecs-core@0.1.0.0/column.bend as Col
6import bendvy-ecs-core@0.1.0.0/ordinary_declaration.bend as Canonical
7
8# Ordinary leaf stores retain the recipe used for admission and export together.
9type Component<-S:Data,-P:Type,-identity:Canonical.Declaration<S,P>,-project:P -> P & D.Raw> is Type:
10  Component{column:Col.Column<S,P>,declaration:Decl.Constructed<S,P,identity,project>}
11type TransientComponent<-S:Data,-P:Type,-identity:Canonical.Declaration<S,P>> is Type:
12  TransientComponent{column:Col.Column<S,P>,declaration:Decl.Transient<S,P,identity>}
13type Resource<-S:Data,-P:Type,-identity:Canonical.Declaration<S,P>,-project:P -> P & D.Raw> is Type:
14  Resource{owner:P,declaration:Decl.Constructed<S,P,identity,project>}
15type TransientResource<-S:Data,-P:Type,-identity:Canonical.Declaration<S,P>> is Type:
16  TransientResource{owner:P,declaration:Decl.Transient<S,P,identity>}
17def factory(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Constructed<S,P,identity,project>) -> Gate.Gate<S,P,identity>:
18  Gate.persisted(~S,~P,~identity,Decl.codec(~S,~P,~identity,~project,declaration),project)
19def fields(field:Gate.Field) -> List<&2,D.Field>:
20  match field:
21    case Gate.Omitted{_}:[]
22    case Gate.Saved{name,value}:[D.Field{name,value}]
23def component_restored(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Constructed<S,P,identity,project>,observed:Col.Column<S,P> & Maybe<&2,Gate.Field>) -> Component<S,P,identity,project> & List<&2,D.Field>:
24  match observed:
25    case (column,None{}):(Component{column,declaration},[])
26    case (column,Some{field}):(Component{column,declaration},fields(field))
27def component_taken(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,+id:U32,+declaration:Decl.Constructed<S,P,identity,project>,outcome:Col.SwapOutcome<S,P>) -> Component<S,P,identity,project> & List<&2,D.Field>:
28  match outcome:
29    case Col.Rejected{column,_}:(Component{column,declaration},[])
30    case Col.Accepted{column,None{}}:(Component{column,declaration},[])
31    case Col.Accepted{column,Some{owner}}:component_restored(~S,~P,~identity,~project,declaration,Col.viewed(~S,~P,~Gate.Field,Gate.export_owner(~S,~P,~identity,factory(~S,~P,~identity,~project,declaration),owner),column,id))
32def component_fields_owned(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,+id:U32,value:Component<S,P,identity,project>) -> Component<S,P,identity,project> & List<&2,D.Field>:
33  match value:
34    case Component{column,declaration}:component_taken(~S,~P,~identity,~project,id,declaration,Col.swap(~S,~P,column,id,None{}))
35def component_fields(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,id:U32,value:Component<S,P,identity,project>) -> Component<S,P,identity,project> & List<&2,D.Field>:
36  component_fields_owned(~S,~P,~identity,~project,id,value)
37def transient_component_fields(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,id:U32,value:TransientComponent<S,P,identity>) -> TransientComponent<S,P,identity> & List<&2,D.Field>:
38  (value,[])
39def resource_restored(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Constructed<S,P,identity,project>,observed:P & Gate.Field) -> Resource<S,P,identity,project> & List<&2,D.Field>:
40  match observed:
41    case (owner,field):(Resource{owner,declaration},fields(field))
42def resource_fields(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,~project:P -> P & D.Raw,value:Resource<S,P,identity,project>) -> Resource<S,P,identity,project> & List<&2,D.Field>:
43  match value:
44    case Resource{owner,+declaration}:resource_restored(~S,~P,~identity,~project,declaration,Gate.export_owner(~S,~P,~identity,factory(~S,~P,~identity,~project,declaration),owner))
45def transient_resource_fields(~S:Data,~P:Type,~identity:Canonical.Declaration<S,P>,value:TransientResource<S,P,identity>) -> TransientResource<S,P,identity> & List<&2,D.Field>:
46  (value,[])