restore_graph_world.bend
bendvy-ecs-core@0.1.0.1 · 31 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/world.bend as W
3import bendvy-ecs-core@0.1.0.1/ordinary_machine_initialization.bend as Init
4import bendvy-ecs-core@0.1.0.1/relation_types.bend as G
5import bendvy-ecs-core@0.1.0.1/relation_commands.bend as Relation
6import bendvy-ecs-core@0.1.0.1/restore_graph_mapping.bend as Mapping
7import bendvy-ecs-core@0.1.0.1/restore_data.bend as Basic
8import bendvy-ecs-core@0.1.0.1/owner_product.bend as Product
9import bendvy-ecs-core@0.1.0.1/decode_data.bend as D
10import bendvy-ecs-core@0.1.0.1/entity_key.bend as Key
11
12type Installed<World:Type> is Type:
13 Installed{world:World}
14 MissingBinding{world:World,saved:Key.Key}
15def store(~S:Data,~C:Type,graph:G.Graph<S>,owner:Relation.Store<S,C>) -> Relation.Store<S,C> & Unit:
16 (Relation.graph_replace(~S,~C,owner,graph),Unit{})
17def machines(~Resources:Type,~Machines:Type,~clear:Machines -> Machines,~install:Machines -> List<&2,D.Field> -> Machines,fields:List<&2,D.Field>,owner:Product.Owner<Resources,Machines>) -> Product.Owner<Resources,Machines> & Unit:
18 match owner:
19 case Product.Owner{resources,values}:(Product.Owner{resources,install(clear(values),fields)},Unit{})
20def joined(~S:Data,~C:Type,~Resources:Type,~Machines:Type,~E:Data,result:W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E> & Unit) -> Installed<W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E>>:
21 match result:
22 case (world,_):Installed{world}
23def graph_joined(~S:Data,~C:Type,~Resources:Type,~Machines:Type,~E:Data,~clear:Machines -> Machines,~install:Machines -> List<&2,D.Field> -> Machines,fields:List<&2,D.Field>,result:W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E> & Unit) -> Installed<W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E>>:
24 match result:
25 case (world,_):joined(~S,~C,~Resources,~Machines,~E,Init.with_resource(~S,~Relation.Store<S,C>,~Product.Owner<Resources,Machines>,~E,~Unit,(owner => machines(~Resources,~Machines,~clear,~install,fields,owner)),world))
26def mapped(~S:Data,~C:Type,~Resources:Type,~Machines:Type,~E:Data,~clear:Machines -> Machines,~install:Machines -> List<&2,D.Field> -> Machines,world:W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E>,fields:List<&2,D.Field>,result:Mapping.Mapped<S>) -> Installed<W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E>>:
27 match result:
28 case Mapping.MissingBinding{saved}:MissingBinding{world,saved}
29 case Mapping.Mapped{graph}:graph_joined(~S,~C,~Resources,~Machines,~E,~clear,~install,fields,W.with_store(~S,~Relation.Store<S,C>,~Product.Owner<Resources,Machines>,~E,~Unit,(owner => store(~S,~C,graph,owner)),world))
30def install(~S:Data,~C:Type,~Resources:Type,~Machines:Type,~E:Data,~clear:Machines -> Machines,~install:Machines -> List<&2,D.Field> -> Machines,world:W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E>,graph:G.Graph<S>,fields:List<&2,D.Field>,bindings:List<&2,Basic.Binding<S>>) -> Installed<W.World<S,Relation.Store<S,C>,Product.Owner<Resources,Machines>,E>>:
31 mapped(~S,~C,~Resources,~Machines,~E,~clear,~install,world,fields,Mapping.remap(~S,graph,bindings))