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