decode_capabilities.bend

bendvy-ecs-core@0.1.0.3 · 22 lines · 6 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/decode_data.bend as D
3import bendvy-ecs-core@0.1.0.3/capabilities.bend as Cap
4import bendvy-ecs-core@0.1.0.3/schema_fragments.bend as SF
5# Generic admission provider. Only the trusted schema author closes decoder,
6# owner lens and admitted/refused transition; gameplay is universal in H.
7# No callback truthfulness or universal Raw->Output inverse is asserted.
8def apply(-H:Type,-Raw:Type,-Observation:Data,cap:Cap.Request<H,Raw,Observation>,raw:Raw,ctx:H) -> H & Observation:
9  match cap:
10    case Cap.Request{run}: run(ctx,raw)
11def provide(~Raw:Type,~Owners:Type,~Observation:Data,~request:Owners -> Raw -> Owners & Observation,~body:@-H:Type -> Cap.Request<H,Raw,Observation> -> Raw -> H -> H & Observation,ctx:Owners,raw:Raw) -> Owners & Observation:
12  body(Owners,Cap.Request{request},raw,ctx)
13def decoded(~Raw:Type,~Owners:Type,~Observation:Data,~admit:Owners -> D.Receipt<Raw> -> Owners & Observation,value:Owners & D.Receipt<Raw>) -> Owners & Observation:
14  match value:
15    case (owners,receipt): admit(owners,receipt)
16def request(~Raw:Type,~Owners:Type,~Observation:Data,~decode:Owners -> Raw -> Owners & D.Receipt<Raw>,~admit:Owners -> D.Receipt<Raw> -> Owners & Observation,owners:Owners,raw:Raw) -> Owners & Observation:
17  decoded(~Raw,~Owners,~Observation,~admit,decode(owners,raw))
18def constructed(~Raw:Type,~Owners:Type,~Observation:Data,~decode:Owners -> Raw -> Owners & D.Receipt<Raw>,~admit:Owners -> D.Receipt<Raw> -> Owners & Observation,~body:@-H:Type -> Cap.Request<H,Raw,Observation> -> Raw -> H -> H & Observation,owners:Owners,raw:Raw) -> Owners & Observation:
19  provide(~Raw,~Owners,~Observation,~request(~Raw,~Owners,~Observation,~decode,~admit),~body,owners,raw)
20# Complete availability is checked before registering or running any callback.
21def provision_declared(~S:Data,~Owners:Type,~Output:Type,~launch:Owners -> Output,fragment:SF.Fragment<S,Owners>,required:List<&2,SF.Entry<S>>) -> SF.Bound<S,Owners,Output>:
22  SF.bind_declared(~S,~Owners,~Output,~launch,fragment,required)