ordinary_checked_condition.bend

bendvy-ecs-core@0.1.0.1 · 93 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.1/ordinary_condition_composition.bend as Old
3import bendvy-ecs-core@0.1.0.1/ordinary_check_declaration.bend as D
4import bendvy-ecs-core@0.1.0.1/world.bend as W
5import bendvy-ecs-core@0.1.0.1/check.bend as K
6
7type Shape is Data:
8  Existing{description:Old.Description}
9  Check{name:String}
10  Constant{value:Bool}
11  Not{inner:Shape}
12  And{left:Shape,right:Shape}
13  Or{left:Shape,right:Shape}
14type Description is Data:Description{shape:Shape,uses:List<&2,D.Use>}
15type Error is Data:
16  CheckError{error:K.Error}
17  NoValue{}
18  InvalidRegistration{}
19  NoBinding{}
20type Evaluation<World:Type,Owner:Type> is Type:
21  Evaluation{world:World,owner:Owner,result:Result<&2,&2,Error,Bool>}
22type Condition<World:Type,Owner:Type,-evaluate:Owner -> World -> Evaluation<World,Owner>> is Type:
23  Condition{owner:Owner,description:Description}
24type Returned<World:Type,Owner:Type,-evaluate:Owner -> World -> Evaluation<World,Owner>> is Type:
25  Returned{world:World,condition:Condition<World,Owner,evaluate>,result:Result<&2,&2,Error,Bool>}
26def check_result(value:Result<&2,&2,K.Error,Bool>) -> Result<&2,&2,Error,Bool>:
27  match value:
28    case Done{value}:Done{value}
29    case Fail{error}:Fail{CheckError{error}}
30def lifted_returned(~World:Type,~Owner:Type,value:Old.Evaluation<World,Owner>) -> Evaluation<World,Owner>:
31  match value:
32    case Old.Value{world,owner,value}:Evaluation{world,owner,Done{value}}
33    case Old.NoValue{world,owner}:Evaluation{world,owner,Fail{NoValue{}}}
34    case Old.InvalidRegistration{world,owner}:Evaluation{world,owner,Fail{InvalidRegistration{}}}
35    case Old.NoBinding{world,owner}:Evaluation{world,owner,Fail{NoBinding{}}}
36def lift_run(~World:Type,~Owner:Type,~evaluate:Owner -> World -> Old.Evaluation<World,Owner>,owner:Owner,world:World) -> Evaluation<World,Owner>:lifted_returned(~World,~Owner,evaluate(owner,world))
37def lift(~World:Type,~Owner:Type,~evaluate:Owner -> World -> Old.Evaluation<World,Owner>,value:Old.Condition<World,Owner,evaluate>) -> Condition<World,Owner,lift_run(~World,~Owner,~evaluate)>:
38  match value:
39    case Old.Condition{owner,description}:Condition{owner,Description{Existing{description},[]}}
40def check_returned(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Data,args:Args,value:K.Checked<S,C,R,E>) -> Evaluation<W.World<S,C,R,E>,Args>:
41  match value:
42    case K.Checked{world,result}:Evaluation{world,args,check_result(result)}
43def check_shared(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Data,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & Bool,~declaration:D.Declaration<S,C,R,E,Ops>,+args:Args,world:W.World<S,C,R,E>) -> Evaluation<W.World<S,C,R,E>,Args>:
44  check_returned(~S,~C,~R,~E,~Args,args,K.run(~S,~C,~R,~E,~Ops,~Args,~body,~D.plan(~S,~C,~R,~E,~Ops,declaration),args,world))
45def check_run(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Data,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & Bool,~declaration:D.Declaration<S,C,R,E,Ops>,args:Args,world:W.World<S,C,R,E>) -> Evaluation<W.World<S,C,R,E>,Args>:
46  check_shared(~S,~C,~R,~E,~Ops,~Args,~body,~declaration,args,world)
47def check(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Data,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & Bool,~declaration:D.Declaration<S,C,R,E,Ops>,name:String,args:Args) -> Condition<W.World<S,C,R,E>,Args,check_run(~S,~C,~R,~E,~Ops,~Args,~body,~declaration)>:
48  Condition{args,Description{Check{name},D.uses(~S,~C,~R,~E,~Ops,declaration)}}
49def constant_shared(~World:Type,+value:Bool,world:World) -> Evaluation<World,Bool>:Evaluation{world,value,Done{value}}
50def constant_run(~World:Type,value:Bool,world:World) -> Evaluation<World,Bool>:constant_shared(~World,value,world)
51def constant(~World:Type,+value:Bool) -> Condition<World,Bool,constant_run(~World)>:Condition{value,Description{Constant{value},[]}}
52def returned(~World:Type,~Owner:Type,~evaluate:Owner -> World -> Evaluation<World,Owner>,description:Description,value:Evaluation<World,Owner>) -> Returned<World,Owner,evaluate>:
53  match value:
54    case Evaluation{world,owner,result}:Returned{world,Condition{owner,description},result}
55def run(~World:Type,~Owner:Type,~evaluate:Owner -> World -> Evaluation<World,Owner>,value:Condition<World,Owner,evaluate>,world:World) -> Returned<World,Owner,evaluate>:
56  match value:
57    case Condition{owner,description}:returned(~World,~Owner,~evaluate,description,evaluate(owner,world))
58def negate(value:Result<&2,&2,Error,Bool>) -> Result<&2,&2,Error,Bool>:
59  match value:
60    case Done{value}:Done{Bool.not(value)}
61    case Fail{error}:Fail{error}
62def negated(~World:Type,~Owner:Type,value:Evaluation<World,Owner>) -> Evaluation<World,Owner>:
63  match value:
64    case Evaluation{world,owner,result}:Evaluation{world,owner,negate(result)}
65def not_run(~World:Type,~Owner:Type,~evaluate:Owner -> World -> Evaluation<World,Owner>,owner:Owner,world:World) -> Evaluation<World,Owner>:negated(~World,~Owner,evaluate(owner,world))
66def not(~World:Type,~Owner:Type,~evaluate:Owner -> World -> Evaluation<World,Owner>,value:Condition<World,Owner,evaluate>) -> Condition<World,Owner,not_run(~World,~Owner,~evaluate)>:
67  match value:
68    case Condition{owner,Description{shape,uses}}:Condition{owner,Description{Not{shape},uses}}
69def right_returned(~World:Type,~Left:Type,~Right:Type,left:Left,value:Evaluation<World,Right>) -> Evaluation<World,Left & Right>:
70  match value:
71    case Evaluation{world,right,result}:Evaluation{world,(left,right),result}
72def selected(~World:Type,~Left:Type,~Right:Type,~right_run:Right -> World -> Evaluation<World,Right>,allowed:Bool,left:Left,right:Right,world:World,+value:Bool) -> Evaluation<World,Left & Right>:
73  match allowed:
74    case False{}:Evaluation{world,(left,right),Done{value}}
75    case True{}:right_returned(~World,~Left,~Right,left,right_run(right,world))
76def same_bool(a:Bool,b:Bool) -> Bool:
77  match a b:
78    case True{} True{}:True{}
79    case False{} False{}:True{}
80    case _ _:False{}
81def left_returned(~World:Type,~Left:Type,~Right:Type,~right_run:Right -> World -> Evaluation<World,Right>,on:Bool,right:Right,value:Evaluation<World,Left>) -> Evaluation<World,Left & Right>:
82  match value:
83    case Evaluation{world,left,Fail{error}}:Evaluation{world,(left,right),Fail{error}}
84    case Evaluation{world,left,Done{+value}}:selected(~World,~Left,~Right,~right_run,same_bool(on,value),left,right,world,value)
85def combined_run(~World:Type,~Left:Type,~Right:Type,~left_run:Left -> World -> Evaluation<World,Left>,~right_run:Right -> World -> Evaluation<World,Right>,~on:Bool,owners:Left & Right,world:World) -> Evaluation<World,Left & Right>:
86  match owners:
87    case (left,right):left_returned(~World,~Left,~Right,~right_run,on,right,left_run(left,world))
88def and_then(~World:Type,~Left:Type,~Right:Type,~left_run:Left -> World -> Evaluation<World,Left>,~right_run:Right -> World -> Evaluation<World,Right>,left:Condition<World,Left,left_run>,right:Condition<World,Right,right_run>) -> Condition<World,Left & Right,combined_run(~World,~Left,~Right,~left_run,~right_run,~True{})>:
89  match left right:
90    case Condition{left,Description{ls,lu}} Condition{right,Description{rs,ru}}:Condition{(left,right),Description{And{ls,rs},List.append(&2,D.Use,lu,ru)}}
91def or_else(~World:Type,~Left:Type,~Right:Type,~left_run:Left -> World -> Evaluation<World,Left>,~right_run:Right -> World -> Evaluation<World,Right>,left:Condition<World,Left,left_run>,right:Condition<World,Right,right_run>) -> Condition<World,Left & Right,combined_run(~World,~Left,~Right,~left_run,~right_run,~False{})>:
92  match left right:
93    case Condition{left,Description{ls,lu}} Condition{right,Description{rs,ru}}:Condition{(left,right),Description{Or{ls,rs},List.append(&2,D.Use,lu,ru)}}