1 import Base 2 import ./clock_state.bend as Clock 3 import ./deferred_command.bend as Deferred 4 import entity_allocator.bend as Alloc 5 import ./world.bend as W 6 import ./column.bend as Col 7 import ./component.bend as C 8 import ./lifecycle.bend as Life 9 import ./recoverable_component.bend as RC 10 # Existing Family lenses remain trusted schema provisioning, not gameplay grants. 11 # No caller-authored inverse or recovery pack callback is introduced. 12 def replaced(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,handle:W.Handle,stamp:Life.Stamp,result:C.Replacement,P>) -> RC.Replacement,S,P>: 13 match result: 14 case C.Replaced{world,previous}:RC.Applied{world,RC.Record{handle,stamp,previous}} 15 case C.ReplaceRejected{world,incoming,error}:RC.Refused{world,incoming,error} 16 def stamped(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,family:C.Family,+handle:W.Handle,incoming:Maybe

,observed:W.World & Life.Stamp) -> RC.Replacement,S,P>: 17 match observed: 18 case (world,stamp):replaced(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,handle,stamp,C.replace(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,family,world,handle,incoming)) 19 def replace(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,+family:C.Family,world:W.World,+handle:W.Handle,incoming:Maybe

) -> RC.Replacement,S,P>: 20 stamped(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,family,handle,incoming,C.lifecycle(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,family,world,handle)) 21 def column_returned(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,rest:Rest,result:Col.Column & RC.Record) -> Store & RC.Record: 22 match result: 23 case (column,released):(put(rest,column),released) 24 def column_taken(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,record:RC.Record,taken:Rest & Col.Column) -> Store & RC.Record: 25 match record taken: 26 case RC.Record{handle,stamp,payload}, (rest,column):column_returned(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,rest,RC.undo_column(~S,~P,handle,stamp,payload,column)) 27 def undone(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,ns:U32,allocator:Alloc.Allocator,resource:R,events:List<&2,E>,pending:List>>,regs:List<&2,W.RegistrationMeta>,sid:U32,clock:Clock.State,result:Store & RC.Record) -> W.World & RC.Record: 28 match result: 29 case (store,released):(W.World{ns,allocator,store,resource,events,pending,regs,sid,clock},released) 30 # Canonical undo_column restores the saved stamp and returns the displaced 31 # payload with its pre-undo stamp. Neither clocks nor unrelated owners rewind. 32 def undo_valid(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,record:RC.Record,world:W.World) -> W.World & RC.Record: 33 match world: 34 case W.World{ns,allocator,store,resource,events,pending,regs,sid,clock}:undone(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,ns,allocator,resource,events,pending,regs,sid,clock,column_taken(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,record,take(store))) 35 def undo_checked(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,record:RC.Record,checked:W.World & Bool) -> W.World & RC.Record: 36 match checked: 37 case (world,False{}):(world,record) 38 case (world,True{}):undo_valid(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,record,world) 39 def undo(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,~family:C.Family,record:RC.Record,world:W.World) -> W.World & RC.Record: 40 match record: 41 case RC.Record{+handle,stamp,payload}:undo_checked(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,RC.Record{handle,stamp,payload},W.valid(~S,~Store,~R,~E,world,handle))