decode_constructed_resource.bend

bendvy-ecs-core@0.1.0.1 · 23 lines · 0 definitions

1import Base
2import decode_construction.bend as Constructor
3import decode_validated_resource.bend as Resource
4import ordinary_declaration.bend as Identity
5import decode_data.bend as D
6import bundle_construction.bend as Build
7import capabilities.bend as Cap
8
9type Output<I:Type,R:Type> is Type:
10  Replaced{canonical:D.Raw,undo:R -> I}
11  Refused{owner:I,error:D.Error}
12def returned(~I:Type,~R:Type,~H:Type,undo:R -> I,result:H & Resource.Output<R>) -> H & Output<I,R>:
13  match result:
14    case (ctx,Resource.Replaced{canonical}):(ctx,Replaced{canonical,undo})
15    case (ctx,Resource.Refused{owner,error}):(ctx,Refused{undo(owner),error})
16def constructed(~I:Type,~R:Type,~H:Type,~request:Cap.OwnedRequest<H,R,Resource.Output<R>>,ctx:H,value:Build.Construction<I,R,D.Error>) -> H & Output<I,R>:
17  match value:
18    case Build.Invalid{owner,error}:(ctx,Refused{owner,error})
19    case Build.Constructed{owner,undo}:returned(~I,~R,~H,undo,Cap.owned_request(~H,~R,~Resource.Output<R>,~request,ctx,owner))
20def apply(~S:Data,~I:Type,~R:Type,~identity:Identity.Declaration<S,R>,~project:R -> R & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction<I,R,D.Error>,~factory:Constructor.Factory<S,I,R,identity,project,incoming,build>,~H:Type,~request:Cap.OwnedRequest<H,R,Resource.Output<R>>,ctx:H,input:I) -> H & Output<I,R>:
21  constructed(~I,~R,~H,~request,ctx,Constructor.construct(~S,~I,~R,~identity,~project,~incoming,~build,factory,input))
22def grant(~S:Data,~I:Type,~R:Type,~identity:Identity.Declaration<S,R>,~project:R -> R & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction<I,R,D.Error>,~factory:Constructor.Factory<S,I,R,identity,project,incoming,build>,~H:Type,~request:Cap.OwnedRequest<H,R,Resource.Output<R>>) -> Cap.OwnedRequest<H,I,Output<I,R>>:
23  Cap.OwnedRequest{ctx => input => apply(~S,~I,~R,~identity,~project,~incoming,~build,~factory,~H,~request,ctx,input)}