1 import Base 2 import entity_key.bend as Key 3 import ./world.bend as W 4 import ./string_equality.bend as Text 5 6 # Lifetime metadata is separate from component owners and never proves liveness. 7 type Scope<-S:Data> is Data: 8 Scope{namespace:U32,name:String} 9 type Member is Data: 10 Member{name:String,id:Key.Key} 11 type Store<-S:Data,C:Type> is Type: 12 Store{components:C,members:List<&2,Member>} 13 def empty(~S:Data,~C:Type,components:C) -> Store: 14 Store{components,[]} 15 def without(members:List<&2,Member>,+id:Key.Key) -> List<&2,Member>: 16 match members: 17 case []:[] 18 case Member{+name,+mid} <> rest: 19 +remaining = without(rest,id) 20 Bool.pick(List<&2,Member>,Key.equal(mid,id),remaining,Member{name,mid} <> remaining) 21 def select(members:List<&2,Member>,+name:String) -> List<&2,Key.Key>: 22 match members: 23 case []:[] 24 case Member{+key,+id} <> rest: 25 +remaining = select(rest,name) 26 Bool.pick(List<&2,Key.Key>,Text.equal(key,name),id <> remaining,remaining) 27 type SpawnResult is Type: 28 Spawned{handle:W.Handle} 29 SpawnRejected{payload:P,error:W.WorldError}