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