relation_failure_reader.bend

bendvy-ecs-core@0.1.0.0 · 28 lines · 0 definitions

1import Base
2import internal/relation_failures/domains.bend as D
3import relation_failure_runtime.bend as K
4import world.bend as W
5import system.bend as Sy
6import relation_types.bend as G
7
8# Trusted ordinary relation declaration: the same descriptor supplies mutation,
9# domain identity and reader access metadata. No second numeric/name registry.
10type Declaration<S:Data> is Data: Declaration{descriptor:G.Descriptor<S>}
11def relation(~S:Data,descriptor:G.Descriptor<S>) -> Declaration<S>: Declaration{descriptor}
12def key(~S:Data,declaration:Declaration<S>) -> D.DescriptorKey<S>:
13  match declaration:
14    case Declaration{G.Descriptor{id,_,_,_}}: D.DeclaredKey{id}
15def access(~S:Data,declaration:Declaration<S>) -> String:
16  match declaration:
17    case Declaration{G.Descriptor{_,name,_,_}}: String.concat([name,":read"])
18def keys(~S:Data,declarations:List<&2,Declaration<S>>) -> List<&2,D.DescriptorKey<S>>:
19  match declarations:
20    case []: []
21    case declaration <> rest: key(~S,declaration) <> keys(~S,rest)
22def accesses(~S:Data,declarations:List<&2,Declaration<S>>) -> List<&2,String>:
23  match declarations:
24    case []: []
25    case declaration <> rest: access(~S,declaration) <> accesses(~S,rest)
26
27def register(~S: Data,~C: Type,~R: Type,~E: Data,~A: Type,~Error: Data,~O: Type,~runner: W.World<S,C,R,E> -> K.Input<S,E,A> -> Sy.Outcome<W.World<S,C,R,E>,Error,O>,runtime: K.Runtime<S,C,R,E>,+declarations: List<&2,Declaration<S>>,+name: String) -> K.Registered<S,C,R,E,A,Error,O,runner>:
28  K.register(~S,~C,~R,~E,~A,~Error,~O,~runner,runtime,keys(~S,declarations),name,accesses(~S,declarations))