1 import Base 2 import ./execution_effects.bend as E 3 import ./world.bend as W 4 import ./execution_system.bend as Sys 5 import ./execution_command_buffer.bend as Buffer 6 import ./execution_command_permission.bend as Permission 7 8 # The buffer is a separate affine owner from gameplay scope and user captures. 9 # This wrapper is the registered system's Local, so every executor outcome 10 # returns it through the existing system owner, including refusal/body error. 11 type Local<-S:Data,-P:Type,-D:Type,-User:Type> is Type: 12 Local{user:User,commands:Buffer.Buffer,permission:Permission.Permission} 13 type Commands<-Q:Type,-S:Data,-P:Type> is Type: 14 Commands{insert:Q -> W.Handle -> P -> Q,remove:Q -> W.Handle -> Q} 15 def fresh(~S:Data,~P:Type,~D:Type,~User:Type,user:User,permission:Permission.Permission) -> Local: 16 Local{user,Buffer.empty(~S,~P,~D),permission} 17 def insert_field(~Q:Type,~S:Data,~P:Type,commands:Commands) -> Q -> W.Handle -> P -> Q: 18 match commands: 19 case Commands{insert,_}:insert 20 def remove_field(~Q:Type,~S:Data,~P:Type,commands:Commands) -> Q -> W.Handle -> Q: 21 match commands: 22 case Commands{_,remove}:remove 23 def returned(~S:Data,~P:Type,~D:Type,~User:Type,~Error:Data,~Out:Data,~H:Type,permission:Permission.Permission,result:H & (Buffer.Buffer & (User & Sys.Completion))) -> H & (Local & Sys.Completion): 24 match result: 25 case (scope,(commands,(user,completion))):(scope,(Local{user,commands,permission},completion)) 26 27 # Internal body adapter; the ordinary registration layer must select the 28 # component family from its closed schema and inventory this buffer for barriers. 29 # Both H and Q remain abstract to gameplay. The body never sees a World, 30 # the allocator, the concrete buffer constructor, or an application callback. 31 def canonical(~S:Data,~P:Type,~D:Type) -> Commands,S,P>: 32 Commands{Buffer.insert(~S,~P,~D),Buffer.remove(~S,~P,~D)} 33 def invoke(~S:Data,~P:Type,~D:Type,~Permit:Data,~F:Type -> Type,~effects:E.Effects,~User:Type,~Error:Data,~Out:Data,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~body:@-Permit:Data -> @-F:(Type -> Type) -> @-effects:E.Effects -> @-H:Type -> @-Q:Type -> @-caps:Ops(Permit,F,H,Q) -> @-commands:Commands -> H -> Q -> User -> F(H & (Q & (User & Sys.Completion))),~H:Type,~caps:Ops(Permit,F,H,Buffer.Buffer),scope:H,local:Local) -> F(H & (Local & Sys.Completion)): 34 match local: 35 case Local{user,commands,permission}:E.map(~F,(H & (Buffer.Buffer & (User & Sys.Completion))),(H & (Local & Sys.Completion)),effects,body(Permit,F,effects,H,Buffer.Buffer,caps,canonical(~S,~P,~D),scope,commands,user),result => returned(~S,~P,~D,~User,~Error,~Out,~H,permission,result))