diff options
Diffstat (limited to '')
| -rw-r--r-- | lib/kernel/EphemeralRelation.ml | 98 |
1 files changed, 27 insertions, 71 deletions
diff --git a/lib/kernel/EphemeralRelation.ml b/lib/kernel/EphemeralRelation.ml index 8aa0463..ddf005d 100644 --- a/lib/kernel/EphemeralRelation.ml +++ b/lib/kernel/EphemeralRelation.ml @@ -1,73 +1,29 @@ -module type DERIVATION = sig - type plan - - val identity : plan -> Concepts.Hash.hash - - val describe : - plan -> (Protocols.Schematics.relation_description, Concepts.Condition.condition) result - - val modes : plan -> (Concepts.Mode.t, Concepts.Condition.condition) result - - val generate : - plan -> - Protocols.Generative.binding -> - (Protocols.Handle.t, Concepts.Condition.condition) result +type t = + { schematics: [`Persisted of Concepts.Hash.hash + | `Temporary of (Protocols.Schematics.attribute_description BatMap.String.t) ] } + +module Error = struct + open Concepts.Condition + let local_constraint_not_implemented = + condition "local-constraint-not-implemented" + "Local constraints have no centralized authority for their discerniment and enforcement yet." + empty + let predicate_not_implemented = + condition "predicate-not-implemented" + "Preciate descriptions for relations is not designed yet." + empty end -module Make (D : DERIVATION) = struct - let pinned_tag = "rnt/pinned/1" - - let identity ?pinned plan = - let derivation = D.identity plan in - match pinned with - | None -> derivation - | Some branch -> - pinned_tag ^ Concepts.Hash.to_raw_string derivation ^ Concepts.Hash.to_raw_string branch - |> Bytes.of_string - |> Concepts.Hash.hash_of_bytes - - class ephemeral (plan : D.plan) address declaration description edges = - object (self) - inherit Lifecycle.counted - inherit Protocols.Generative.membership - val heading = Concepts.Mode.attributes_of_map description - method destroy = List.iter Protocols.Handle.release edges - method predicate = Ok None - method local_constraints = Ok None - method modes = Ok declaration - - (* A cursor holds a reference to its relation, so the edges it reads - outlive a release of the relation that produced it. *) - method generate binding = - D.generate plan binding - |> Result.map (fun cursor -> - new Lifecycle.retaining cursor (self :> Lifecycle.lifecycle) |> Protocols.Handle.make ) - - method enumerate = self#generate Protocols.Generative.nothing - method describe () = Ok (Protocols.Schematics.Relation description) - - method protocols : Protocols.Handle.protocol list = - let carried = - [ Protocols.Relation.make self; - Protocols.Schematics.make self; - Protocols.Generative.make self ] - in - if Concepts.Mode.exhaustible declaration BatSet.String.empty then - Protocols.Enumerable.make self :: carried - else carried - - method hash : Concepts.Hash.hash = address - end - - let derive ?pinned ?(edges = []) plan = - let open Utilities.Result in - let derived = - let* declaration = D.modes plan in - let* description = D.describe plan in - Ok - ( new ephemeral plan (identity ?pinned plan) declaration description edges - |> Protocols.Handle.make ) - in - Result.iter_error (fun _ -> List.iter Protocols.Handle.release edges) derived; - derived -end +class ephemeral_relation program address value = + object (self) + inherit Lifecycle.null + val relation : t = value + method local_constraints = Error Error.local_constraint_not_implemented + method predicate = Error Error.predicate_not_implemented + + method protocol : Protocols.Handle.protocol list = + Protocols.[ Relation.make self + ; Enumerable.make self + ; Schematics.make self ] + method hash : Concepts.Hash.hash = address + end |
