system_instance.bend
bendvy-ecs-core@0.1.0.1 · 65 lines · 0 definitions
1import Base
2import world.bend as W
3import system.bend as Sys
4import system_cleanup.bend as Cleanup
5
6# Closed schema factory indices are erased; registry and ports remain affine.
7type Instance<S: Data,C: Type,R: Type,E: Data,Args: Type,Error: Data,Output: Type,-run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,Ports: Type,-validate: Ports -> U32 -> U32 -> Ports & Bool,-remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>> is Type:
8 Instance{owned: Cleanup.Instance<S,C,R,E,Args,Error,Output,run,Ports>}
9type Disposal<S: Data,C: Type,R: Type,E: Data,Args: Type,Error: Data,Output: Type,-run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,Ports: Type,-validate: Ports -> U32 -> U32 -> Ports & Bool,-remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>> is Type:
10 Disposed{world: W.World<S,C,R,E>}
11 Rejected{world: W.World<S,C,R,E>,instance: Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>}
12
13# Schema authors bind these indices once in their ordinary registration factory.
14def bind(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,registry: Sys.Registry<S,C,R,E,Args,Error,Output,run>,ports: Ports) -> Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
15 Instance{Cleanup.Instance{registry,ports}}
16
17def disposed(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,result: Cleanup.Cleanup<S,C,R,E,Args,Error,Output,run,Ports>) -> Disposal<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
18 match result:
19 case Cleanup.Cleaned{world}: Disposed{world}
20 case Cleanup.CleanupRejected{world,instance}: Rejected{world,Instance{instance}}
21
22# Callers supply only their actual instance and world; no runtime metadata callbacks.
23def dispose(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,instance: Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>,world: W.World<S,C,R,E>) -> Disposal<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
24 match instance:
25 case Instance{owned}: disposed(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,Cleanup.cleanup(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,owned,world))
26
27type Registration<S: Data,C: Type,R: Type,E: Data,Args: Type,Error: Data,Output: Type,-run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,Ports: Type,-validate: Ports -> U32 -> U32 -> Ports & Bool,-remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>> is Type:
28 Registered{world: W.World<S,C,R,E>,instance: Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>}
29 RegistrationFailed{world: W.World<S,C,R,E>}
30
31def created_ports(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,registry: Sys.Registry<S,C,R,E,Args,Error,Output,run>,observed: W.World<S,C,R,E> & Ports) -> Registration<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
32 match observed:
33 case (world,ports): Registered{world,bind(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,registry,ports)}
34
35def created(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,~create: U32 -> U32 -> W.World<S,C,R,E> -> W.World<S,C,R,E> & Ports,world: W.World<S,C,R,E>,namespace: U32,identified: Sys.Registry<S,C,R,E,Args,Error,Output,run> & U32) -> Registration<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
36 match identified:
37 case (registry,id): created_ports(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,registry,create(namespace,id,world))
38
39def namespaced(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,~create: U32 -> U32 -> W.World<S,C,R,E> -> W.World<S,C,R,E> & Ports,registry: Sys.Registry<S,C,R,E,Args,Error,Output,run>,observed: W.World<S,C,R,E> & U32) -> Registration<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
40 match observed:
41 case (world,namespace): created(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,~create,world,namespace,Sys.identity(~S,~C,~R,~E,~Args,~Error,~Output,~run,registry))
42
43def registered(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,~create: U32 -> U32 -> W.World<S,C,R,E> -> W.World<S,C,R,E> & Ports,result: Sys.RegistrationResult<S,C,R,E,Args,Error,Output,run>) -> Registration<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
44 match result:
45 case Sys.RegistrationFailed{world}: RegistrationFailed{world}
46 case Sys.Registered{world,registry}: namespaced(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,~create,registry,W.namespace(~S,~C,~R,~E,world))
47
48# The schema factory specializes create/validate/remove once. Failed registration
49# constructs no ports; successful ports use the actual namespace and registry id.
50def register(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,~create: U32 -> U32 -> W.World<S,C,R,E> -> W.World<S,C,R,E> & Ports,world: W.World<S,C,R,E>,+name: String,+access: List<&2,String>) -> Registration<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
51 registered(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,~create,Sys.register(~S,~C,~R,~E,~Args,~Error,~Output,~run,world,name,access))
52
53type RunResult<S: Data,C: Type,R: Type,E: Data,Args: Type,Error: Data,Output: Type,-run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,Ports: Type,-validate: Ports -> U32 -> U32 -> Ports & Bool,-remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>> is Type:
54 Completed{instance: Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>,outcome: Sys.Outcome<W.World<S,C,R,E>,Error,Output>}
55 RegistrationRejected{instance: Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>,world: W.World<S,C,R,E>,args: Args}
56
57def ran(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,ports: Ports,result: Sys.RunResult<S,C,R,E,Args,Error,Output,run>) -> RunResult<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
58 match result:
59 case Sys.Completed{registry,outcome}: Completed{bind(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,registry,ports),outcome}
60 case Sys.RegistrationRejected{registry,world,args}: RegistrationRejected{bind(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,registry,ports),world,args}
61
62# Managed execution returns its advanced registry into the same instance.
63def run(~S: Data,~C: Type,~R: Type,~E: Data,~Args: Type,~Error: Data,~Output: Type,~run: W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Ports: Type,~validate: Ports -> U32 -> U32 -> Ports & Bool,~remove: W.World<S,C,R,E> -> Ports -> W.World<S,C,R,E>,instance: Instance<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>,world: W.World<S,C,R,E>,args: Args) -> RunResult<S,C,R,E,Args,Error,Output,run,Ports,validate,remove>:
64 match instance:
65 case Instance{Cleanup.Instance{registry,ports}}: ran(~S,~C,~R,~E,~Args,~Error,~Output,~run,~Ports,~validate,~remove,ports,Sys.run(~S,~C,~R,~E,~Args,~Error,~Output,~run,registry,world,args))