bundle_install.bend
bendvy-ecs-core@0.1.0.1 · 41 lines · 0 definitions
1import Base
2import bundle_pack.bend as B
3import world.bend as W
4
5type Restore<World:Type,P:Type,Q:Type> is Type:
6 Restored{world:World,payload:P}
7 Pending{world:World,recovery:Q,error:W.WorldError}
8type Attempt<World:Type,P:Type,Q:Type> is Type:
9 Installed{world:World,undo:World -> Restore<World,P,Q>}
10 Refused{world:World,payload:P,error:W.WorldError}
11 Quarantined{world:World,recovery:Q,error:W.WorldError}
12type Recovery<World:Type,H:Type,HQ:Type,Tail:Type,TQ:Type> is Type:
13 HeadPending{head:HQ,tail:Tail}
14 TailPending{undoHead:World -> Restore<World,H,HQ>,tail:TQ}
15def restored_head(~World:Type,~H:Type,~HQ:Type,~Tail:Type,~TQ:Type,result:Restore<World,H,HQ>,tail:Tail) -> Restore<World,B.Pack<H,Tail>,Recovery<World,H,HQ,Tail,TQ>>:
16 match result:
17 case Restored{world,head}: Restored{world,B.Pack{head,tail}}
18 case Pending{world,head,error}: Pending{world,HeadPending{head,tail},error}
19def restored_tail(~World:Type,~H:Type,~HQ:Type,~Tail:Type,~TQ:Type,undoHead:World -> Restore<World,H,HQ>,result:Restore<World,Tail,TQ>) -> Restore<World,B.Pack<H,Tail>,Recovery<World,H,HQ,Tail,TQ>>:
20 match result:
21 case Restored{world,tail}: restored_head(~World,~H,~HQ,~Tail,~TQ,undoHead(world),tail)
22 case Pending{world,tail,error}: Pending{world,TailPending{undoHead,tail},error}
23def refused_head(~World:Type,~H:Type,~HQ:Type,~Tail:Type,~TQ:Type,result:Restore<World,H,HQ>,tail:Tail,error:W.WorldError) -> Attempt<World,B.Pack<H,Tail>,Recovery<World,H,HQ,Tail,TQ>>:
24 match result:
25 case Restored{world,head}: Refused{world,B.Pack{head,tail},error}
26 case Pending{world,head,restoreError}: Quarantined{world,HeadPending{head,tail},restoreError}
27def installed_tail(~World:Type,~H:Type,~HQ:Type,~Tail:Type,~TQ:Type,undoHead:World -> Restore<World,H,HQ>,result:Attempt<World,Tail,TQ>) -> Attempt<World,B.Pack<H,Tail>,Recovery<World,H,HQ,Tail,TQ>>:
28 match result:
29 case Refused{world,tail,error}: refused_head(~World,~H,~HQ,~Tail,~TQ,undoHead(world),tail,error)
30 case Quarantined{world,tail,error}: Quarantined{world,TailPending{undoHead,tail},error}
31 case Installed{world,undoTail}: Installed{world,w => restored_tail(~World,~H,~HQ,~Tail,~TQ,undoHead,undoTail(w))}
32def installed_head(~World:Type,~H:Type,~HQ:Type,~Tail:Type,~TQ:Type,~installTail:World -> Tail -> Attempt<World,Tail,TQ>,result:Attempt<World,H,HQ>,tail:Tail) -> Attempt<World,B.Pack<H,Tail>,Recovery<World,H,HQ,Tail,TQ>>:
33 match result:
34 case Refused{world,head,error}: Refused{world,B.Pack{head,tail},error}
35 case Quarantined{world,head,error}: Quarantined{world,HeadPending{head,tail},error}
36 case Installed{world,undo}: installed_tail(~World,~H,~HQ,~Tail,~TQ,undo,installTail(world,tail))
37def install(~World:Type,~H:Type,~HQ:Type,~Tail:Type,~TQ:Type,~installHead:World -> H -> Attempt<World,H,HQ>,~installTail:World -> Tail -> Attempt<World,Tail,TQ>,world:World,payload:B.Pack<H,Tail>) -> Attempt<World,B.Pack<H,Tail>,Recovery<World,H,HQ,Tail,TQ>>:
38 match payload:
39 case B.Pack{head,tail}: installed_head(~World,~H,~HQ,~Tail,~TQ,~installTail,installHead(world,head),tail)
40def terminal(~World:Type,world:World,payload:Unit) -> Attempt<World,Unit,Unit>:
41 Installed{world,w => Restored{w,Unit{}}}