1 import Base 2 import ./snapshot_schema.bend as Schema 3 import ./decode_data.bend as D 4 import ./owner_product.bend as Product 5 import ./ordinary_schema.bend as Ordinary 6 def joined_components(~LC:Type,~RC:Type,left:LC,fields:List<&2,D.Field>,observed:RC & List<&2,D.Field>) -> Product.Owner & List<&2,D.Field>: 7 match observed: 8 case (right,more):(Product.Owner{left,right},List.append(&2,D.Field,fields,more)) 9 def right_components(~LC:Type,~RC:Type,~right:U32 -> RC -> RC & List<&2,D.Field>,id:U32,owner:RC,observed:LC & List<&2,D.Field>) -> Product.Owner & List<&2,D.Field>: 10 match observed: 11 case (left,fields):joined_components(~LC,~RC,left,fields,right(id,owner)) 12 def product_components_owned(~LC:Type,~RC:Type,~left:U32 -> LC -> LC & List<&2,D.Field>,~right:U32 -> RC -> RC & List<&2,D.Field>,+id:U32,owner:Product.Owner) -> Product.Owner & List<&2,D.Field>: 13 match owner: 14 case Product.Owner{a,b}:right_components(~LC,~RC,~right,id,b,left(id,a)) 15 def product_components(~LC:Type,~RC:Type,~left:U32 -> LC -> LC & List<&2,D.Field>,~right:U32 -> RC -> RC & List<&2,D.Field>,id:U32,owner:Product.Owner) -> Product.Owner & List<&2,D.Field>: 16 product_components_owned(~LC,~RC,~left,~right,id,owner) 17 def right_resources(~LR:Type,~RR:Type,~right:RR -> RR & List<&2,D.Field>,owner:RR,observed:LR & List<&2,D.Field>) -> Product.Owner & List<&2,D.Field>: 18 match observed: 19 case (left,fields):joined_components(~LR,~RR,left,fields,right(owner)) 20 def product_resources(~LR:Type,~RR:Type,~left:LR -> LR & List<&2,D.Field>,~right:RR -> RR & List<&2,D.Field>,owner:Product.Owner) -> Product.Owner & List<&2,D.Field>: 21 match owner: 22 case Product.Owner{a,b}:right_resources(~LR,~RR,~right,b,left(a)) 23 def product(~S:Data,~LC:Type,~LR:Type,~RC:Type,~RR:Type,~leftEligible:Bool,~rightEligible:Bool,~leftComponents:U32 -> LC -> LC & List<&2,D.Field>,~leftResources:LR -> LR & List<&2,D.Field>,~rightComponents:U32 -> RC -> RC & List<&2,D.Field>,~rightResources:RR -> RR & List<&2,D.Field>,left:Schema.Schema,right:Schema.Schema) -> Schema.Schema,Product.Owner,Bool.and(leftEligible,rightEligible),product_components(~LC,~RC,~leftComponents,~rightComponents),product_resources(~LR,~RR,~leftResources,~rightResources)>: 24 Schema.Schema{Ordinary.product(~S,~LC,~LR,~RC,~RR,Schema.inventory(~S,~LC,~LR,~leftEligible,~leftComponents,~leftResources,left),Schema.inventory(~S,~RC,~RR,~rightEligible,~rightComponents,~rightResources,right))}