snapshot_product.bend
bendvy-ecs-core@0.1.0.0 · 24 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/snapshot_schema.bend as Schema
3import bendvy-ecs-core@0.1.0.0/decode_data.bend as D
4import bendvy-ecs-core@0.1.0.0/owner_product.bend as Product
5import bendvy-ecs-core@0.1.0.0/ordinary_schema.bend as Ordinary
6def joined_components(~LC:Type,~RC:Type,left:LC,fields:List<&2,D.Field>,observed:RC & List<&2,D.Field>) -> Product.Owner<LC,RC> & List<&2,D.Field>:
7 match observed:
8 case (right,more):(Product.Owner{left,right},List.append(&2,D.Field,fields,more))
9def 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<LC,RC> & List<&2,D.Field>:
10 match observed:
11 case (left,fields):joined_components(~LC,~RC,left,fields,right(id,owner))
12def 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<LC,RC>) -> Product.Owner<LC,RC> & List<&2,D.Field>:
13 match owner:
14 case Product.Owner{a,b}:right_components(~LC,~RC,~right,id,b,left(id,a))
15def 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<LC,RC>) -> Product.Owner<LC,RC> & List<&2,D.Field>:
16 product_components_owned(~LC,~RC,~left,~right,id,owner)
17def right_resources(~LR:Type,~RR:Type,~right:RR -> RR & List<&2,D.Field>,owner:RR,observed:LR & List<&2,D.Field>) -> Product.Owner<LR,RR> & List<&2,D.Field>:
18 match observed:
19 case (left,fields):joined_components(~LR,~RR,left,fields,right(owner))
20def product_resources(~LR:Type,~RR:Type,~left:LR -> LR & List<&2,D.Field>,~right:RR -> RR & List<&2,D.Field>,owner:Product.Owner<LR,RR>) -> Product.Owner<LR,RR> & List<&2,D.Field>:
21 match owner:
22 case Product.Owner{a,b}:right_resources(~LR,~RR,~right,b,left(a))
23def 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<S,LC,LR,leftEligible,leftComponents,leftResources>,right:Schema.Schema<S,RC,RR,rightEligible,rightComponents,rightResources>) -> Schema.Schema<S,Product.Owner<LC,RC>,Product.Owner<LR,RR>,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))}