restored_row.bend
bendvy-ecs-core@0.1.0.0 · 48 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/change_tick.bend as Tick
3import column.bend as Col
4import lifecycle.bend as L
5import captured_column.bend as K
6
7# Closed provisioning supplies affine restoration; universal gameplay sees H.
8type Cell<-S:Data,-C:Type> is Type:
9 Taken{id:U32,owner:Maybe<&1,C>,stamp:L.Stamp,dirty:Bool,restore:K.Slot<C> -> Col.Column<S,C>}
10 Untaken{column:Col.Column<S,C>}
11type Projected<-S:Data,-C:Type,-V:Data> is Type:
12 Projected{cell:Cell<S,C>,value:Maybe<&2,V>}
13 Deferred{cell:Cell<S,C>}
14
15def captured(~S:Data,~C:Type,result:K.Capture<S,C>) -> Cell<S,C>:
16 match result:
17 case K.Captured{id,owner,stamp,restore}: Taken{id,owner,stamp,False{},restore}
18 case K.Unavailable{column}: Untaken{column}
19def detach(~S:Data,~C:Type,column:Col.Column<S,C>,+id:U32) -> Cell<S,C>:
20 captured(~S,~C,K.capture(~S,~C,column,id))
21def attach(~S:Data,~C:Type,cell:Cell<S,C>) -> Col.Column<S,C>:
22 match cell:
23 case Taken{_,owner,stamp,dirty,restore}: restore(K.Slot{owner,stamp,dirty})
24 case Untaken{column}: column
25def projected_owner(~S:Data,~C:Type,~V:Data,+id:U32,stamp:L.Stamp,dirty:Bool,cold:K.Slot<C> -> Col.Column<S,C>,result:C & V) -> Projected<S,C,V>:
26 match result:
27 case (owner,value): Projected{Taken{id,Some{owner},stamp,dirty,cold},Some{value}}
28def project(~S:Data,~C:Type,~V:Data,~project:C -> C & V,cell:Cell<S,C>) -> Projected<S,C,V>:
29 match cell:
30 case Taken{id,None{},stamp,dirty,cold}: Projected{Taken{id,None{},stamp,dirty,cold},None{}}
31 case Taken{id,Some{owner},stamp,dirty,cold}: projected_owner(~S,~C,~V,id,stamp,dirty,cold,project(owner))
32 case Untaken{column}: Deferred{Untaken{column}}
33
34type Replacement<-S:Data,-C:Type> is Type:
35 Replaced{cell:Cell<S,C>,previous:Maybe<&1,C>,stamp:L.Stamp}
36 Refused{cell:Cell<S,C>,incoming:C}
37def replacement_present(~S:Data,~C:Type,+id:U32,+stamp:L.Stamp,cold:K.Slot<C> -> Col.Column<S,C>,incoming:C,+tick:Tick.Tick,observed:Maybe<&1,C> & Bool) -> Replacement<S,C>:
38 match observed:
39 case (previous,present): Replaced{Taken{id,Some{incoming},L.after_write(True{},present,stamp,tick),True{},cold},previous,stamp}
40def owner_present(~C:Type,owner:Maybe<&1,C>) -> Maybe<&1,C> & Bool:
41 match owner:
42 case None{}: (None{},False{})
43 case Some{owner}: (Some{owner},True{})
44# Caller validates entity/clock first and journals returned previous+stamp now.
45def replace(~S:Data,~C:Type,cell:Cell<S,C>,incoming:C,+tick:Tick.Tick) -> Replacement<S,C>:
46 match cell:
47 case Taken{+id,owner,+stamp,_,cold}: replacement_present(~S,~C,id,stamp,cold,incoming,tick,owner_present(~C,owner))
48 case Untaken{column}: Refused{Untaken{column},incoming}