lifetime_scope.bend

bendvy-ecs-core@0.1.0.3 · 29 lines · 7 definitions

1import Base
2import entity_key.bend as Key
3import bendvy-ecs-core@0.1.0.3/world.bend as W
4import bendvy-ecs-core@0.1.0.3/string_equality.bend as Text
5
6# Lifetime metadata is separate from component owners and never proves liveness.
7type Scope<-S:Data> is Data:
8  Scope{namespace:U32,name:String}
9type Member is Data:
10  Member{name:String,id:Key.Key}
11type Store<-S:Data,C:Type> is Type:
12  Store{components:C,members:List<&2,Member>}
13def empty(~S:Data,~C:Type,components:C) -> Store<S,C>:
14  Store{components,[]}
15def 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)
21def 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)
27type SpawnResult<S:Data,P:Type> is Type:
28  Spawned{handle:W.Handle<S>}
29  SpawnRejected{payload:P,error:W.WorldError}