internal/compact_operational_frame.bend

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

1import Base
2import bendvy-ecs-core@0.1.0.0/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.0/clock_state.bend as Clock
4import bendvy-ecs-core@0.1.0.0/world.bend as W
5import bendvy-ecs-core@0.1.0.0/entity_allocator.bend as A
6import bendvy-ecs-core@0.1.0.0/transaction.bend as T
7import bendvy-ecs-core@0.1.0.0/trace_facts.bend as Facts
8import bendvy-ecs-core@0.1.0.0/deferred_command.bend as Deferred
9import bendvy-ecs-core@0.1.0.0/compose.bend as Q
10import bendvy-ecs-core@0.1.0.0/component.bend as C
11import bendvy-ecs-core@0.1.0.0/column.bend as Col
12import bendvy-ecs-core@0.1.0.0/internal/query_read_session.bend as Session
13
14# Read operations retain this affine shell without inspecting its fields.
15type Shell<-S:Data,-Store:Type,-R:Type,-E:Data> is Type:
16  Shell{resource:R,worldEvents:List<&2,E>,pending:List<Deferred.Command<W.World<S,Store,R,E>>>,registrations:List<&2,W.RegistrationMeta>,nextSystemId:U32,clock:Clock.State,undo:List<(W.World<S,Store,R,E> -> W.World<S,Store,R,E>)>,commands:List<Deferred.Command<W.World<S,Store,R,E>>>,events:List<&2,E>,trace:Facts.State}
17type Frame<-S:Data,-Store:Type,-R:Type,-E:Data> is Type:
18  Frame{namespace:U32,allocator:A.Allocator,store:Store,handle:W.Handle<S>,error:Maybe<&2,W.WorldError>,cursor:Maybe<&2,Tick.Tick>,shell:Shell<S,Store,R,E>}
19def extract(~S:Data,~Store:Type,~R:Type,~E:Data,frame:Q.Frame<S,Store,R,E>) -> Frame<S,Store,R,E>:
20  match frame:
21    case Q.Frame{T.Tx{W.World{namespace,allocator,store,resource,worldEvents,pending,registrations,nextSystemId,clock},undo,commands,events,trace},handle,error,cursor}:Frame{namespace,allocator,store,handle,error,cursor,Shell{resource,worldEvents,pending,registrations,nextSystemId,clock,undo,commands,events,trace}}
22def restore(~S:Data,~Store:Type,~R:Type,~E:Data,frame:Frame<S,Store,R,E>) -> Q.Frame<S,Store,R,E>:
23  match frame:
24    case Frame{namespace,allocator,store,handle,error,cursor,Shell{resource,worldEvents,pending,registrations,nextSystemId,clock,undo,commands,events,trace}}:Q.Frame{T.Tx{W.World{namespace,allocator,store,resource,worldEvents,pending,registrations,nextSystemId,clock},undo,commands,events,trace},handle,error,cursor}
25
26def extract_value(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,observed:Q.Frame<S,Store,R,E> & V) -> Frame<S,Store,R,E> & V:
27  match observed:
28    case (frame,value):(extract(~S,~Store,~R,~E,frame),value)
29def bridge_get(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,~get:Q.Frame<S,Store,R,E> -> Q.Frame<S,Store,R,E> & V,frame:Frame<S,Store,R,E>) -> Frame<S,Store,R,E> & V:
30  extract_value(~S,~Store,~R,~E,~V,get(restore(~S,~Store,~R,~E,frame)))
31def bridge_set(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~set:Q.Frame<S,Store,R,E> -> P -> Q.Frame<S,Store,R,E>,frame:Frame<S,Store,R,E>,value:P) -> Frame<S,Store,R,E>:
32  extract(~S,~Store,~R,~E,set(restore(~S,~Store,~R,~E,frame),value))
33
34def read_returned(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,handle:W.Handle<S>,error:Maybe<&2,W.WorldError>,shell:Shell<S,Store,R,E>,observed:Session.Owner<S,Store> & C.Access<V>) -> Frame<S,Store,R,E> & C.Access<V>:
35  match observed:
36    case (Session.Owner{namespace,allocator,store,cursor},value):(Frame{namespace,allocator,store,handle,error,cursor,shell},value)
37def read(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,frame:Frame<S,Store,R,E>) -> Frame<S,Store,R,E> & C.Access<V>:
38  match frame:
39    case Frame{namespace,allocator,store,+handle,error,cursor,shell}:read_returned(~S,~Store,~R,~E,~V,handle,error,shell,Session.read(~S,~Store,~Rest,~P,~V,~take,~put,~view,Session.Owner{namespace,allocator,store,cursor},handle))
40def selected(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,mode:Q.Selection,observed:Frame<S,Store,R,E> & C.Access<V>) -> Frame<S,Store,R,E> & Bool:
41  match observed:
42    case (frame,value):(frame,Q.selected_value(~V,mode,value))
43def family_match(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,~mode:Q.Selection,frame:Frame<S,Store,R,E>) -> Frame<S,Store,R,E> & Bool:
44  selected(~S,~Store,~R,~E,~V,mode,read(~S,~Store,~R,~E,~Rest,~P,~V,~take,~put,~view,frame))
45def all(~S:Data,~Store:Type,~R:Type,~E:Data,frame:Frame<S,Store,R,E>) -> Frame<S,Store,R,E> & Bool:
46  (frame,True{})
47def and_selected(~S:Data,~Store:Type,~R:Type,~E:Data,~right:Frame<S,Store,R,E> -> Frame<S,Store,R,E> & Bool,observed:Frame<S,Store,R,E> & Bool) -> Frame<S,Store,R,E> & Bool:
48  match observed:
49    case (frame,False{}):(frame,False{})
50    case (frame,True{}):right(frame)
51def both(~S:Data,~Store:Type,~R:Type,~E:Data,~left:Frame<S,Store,R,E> -> Frame<S,Store,R,E> & Bool,~right:Frame<S,Store,R,E> -> Frame<S,Store,R,E> & Bool,frame:Frame<S,Store,R,E>) -> Frame<S,Store,R,E> & Bool:
52  and_selected(~S,~Store,~R,~E,~right,left(frame))