1 import Base 2 import decode_construction.bend as Constructor 3 import ordinary_declaration.bend as Identity 4 import decode_data.bend as D 5 import bundle_construction.bend as Build 6 import decode_requests.bend as Request 7 import bundle_requests.bend as Commands 8 import world.bend as W 9 import capabilities.bend as Cap 10 11 type Input is Type:Input{operation:Commands.Operation,raw:I} 12 type Error is Data:Construction{error:Constructor.Error} Operation{error:Request.Error} 13 type Output is Type: 14 Accepted{target:W.Handle,spawned:Bool,canonical:D.Raw,undo:P -> I} 15 Refused{owner:Maybe<&1,I>,error:Error} 16 def refused(~S:Data,~I:Type,~P:Type,~Custom:Data,undo:P -> I,owner:Maybe<&1,P>,error:Request.Error) -> Output: 17 match owner: 18 case None{}:Refused{None{},Operation{error}} 19 case Some{owner}:Refused{Some{undo(owner)},Operation{error}} 20 def returned(~S:Data,~I:Type,~P:Type,~Custom:Data,~H:Type,undo:P -> I,result:H & Request.Output) -> H & Output: 21 match result: 22 case (ctx,Request.Accepted{target,spawned,canonical}):(ctx,Accepted{target,spawned,canonical,undo}) 23 case (ctx,Request.Refused{owner,error}):(ctx,refused(~S,~I,~P,~Custom,undo,owner,error)) 24 def constructed(~S:Data,~I:Type,~P:Type,~Custom:Data,~H:Type,~request:Cap.OwnedRequest,Request.Output>,ctx:H,operation:Commands.Operation,result:Build.Construction>) -> H & Output: 25 match result: 26 case Build.Invalid{owner,error}:(ctx,Refused{Some{owner},Construction{error}}) 27 case Build.Constructed{owner,undo}:returned(~S,~I,~P,~Custom,~H,undo,Cap.owned_request(~H,~Request.Input,~Request.Output,~request,ctx,Request.Input{operation,owner})) 28 def apply(~S:Data,~I:Type,~P:Type,~Custom:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction,~factory:Constructor.FallibleFactory,~H:Type,~request:Cap.OwnedRequest,Request.Output>,ctx:H,input:Input) -> H & Output: 29 match input: 30 case Input{operation,raw}:constructed(~S,~I,~P,~Custom,~H,~request,ctx,operation,Constructor.fallible_construct(~S,~I,~P,~Custom,~identity,~project,~incoming,~build,factory,raw)) 31 def grant(~S:Data,~I:Type,~P:Type,~Custom:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction,~factory:Constructor.FallibleFactory,~H:Type,~request:Cap.OwnedRequest,Request.Output>) -> Cap.OwnedRequest,Output>: 32 Cap.OwnedRequest{ctx => input => apply(~S,~I,~P,~Custom,~identity,~project,~incoming,~build,~factory,~H,~request,ctx,input)}