1 import Base 2 import ./relation_types.bend as T 3 import ./entity_key.bend as Key 4 5 # Both storage adapters execute this same cleanup continuation. Intents carry 6 # identities and descriptors only; they contain no World mutator or owner. 7 type Intent<-S:Data> is Data: 8 Check{key:Key.Key,descriptors:List<&2,T.Descriptor>,frames:List<&2,T.CleanupFrame>} 9 Observe{key:Key.Key,descriptor:T.Descriptor,remaining:List<&2,T.Descriptor>,frames:List<&2,T.CleanupFrame>} 10 Unrelate{key:Key.Key,descriptor:T.Descriptor,frames:List<&2,T.CleanupFrame>} 11 Finish{key:Key.Key,frames:List<&2,T.CleanupFrame>} 12 Continue{frames:List<&2,T.CleanupFrame>} 13 def child_intent(-S:Data,kind:T.RelationKind,+key:Key.Key,+descriptor:T.Descriptor,remaining:List<&2,T.Descriptor>,child:Key.Key,children:List<&2,Key.Key>,frames:List<&2,T.CleanupFrame>) -> Intent: 14 match kind: 15 case T.Hierarchy{}:Continue{T.CleanupEnter{child} <> T.CleanupChildren{key,descriptor,remaining,children} <> frames} 16 case T.Ordinary{}:Unrelate{child,descriptor,T.CleanupChildren{key,descriptor,remaining,children} <> frames} 17 def kind(-S:Data,descriptor:T.Descriptor) -> T.RelationKind: 18 match descriptor: 19 case T.Descriptor{_,_,_,kind}:kind 20 def next(-S:Data,frame:T.CleanupFrame,descriptors:List<&2,T.Descriptor>,frames:List<&2,T.CleanupFrame>) -> Intent: 21 match frame: 22 case T.CleanupEnter{key}:Check{key,descriptors,frames} 23 case T.CleanupDescriptors{key,[]}:Continue{T.CleanupFinish{key} <> frames} 24 case T.CleanupDescriptors{key,descriptor <> remaining}:Observe{key,descriptor,remaining,frames} 25 case T.CleanupChildren{+key,descriptor,remaining,[]}:Unrelate{key,descriptor,T.CleanupDescriptors{key,remaining} <> frames} 26 case T.CleanupChildren{key,+descriptor,remaining,child <> children}:child_intent(S,kind(S,descriptor),key,descriptor,remaining,child,children,frames) 27 case T.CleanupFinish{key}:Finish{key,frames}