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))