From f49890e12d7eb6a766b966438cd475f7cbf5081b Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Thu, 8 Oct 2026 00:59:05 -0300 Subject: rework evaluators and add schema scope --- lib/kernel/Initialization.ml | 70 +++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 30 deletions(-) (limited to 'lib/kernel/Initialization.ml') diff --git a/lib/kernel/Initialization.ml b/lib/kernel/Initialization.ml index 692aa7f..518fe4f 100644 --- a/lib/kernel/Initialization.ml +++ b/lib/kernel/Initialization.ml @@ -6,33 +6,50 @@ module Error = struct ("name" |=| Concepts.Value.String name) end -module Make (S : Abstract.Storage.STORAGE) = struct - module BM = BranchManager.Make (S) +let bind namespace (name, handle) = + let open Utilities.Result in + let* registry = Protocols.Handle.require Protocols.Registry.from namespace in + let* bound = Protocols.Registry.update registry name None (Some handle) in + if bound then Ok () else Error (Error.taken name) - let bind namespace (name, handle) = - let open Utilities.Result in - let* registry = Protocols.Handle.require Protocols.Registry.from namespace in - let* bound = Protocols.Registry.update registry name None (Some handle) in - if bound then Ok () else Error (Error.taken name) +let namespace entries = + let into = Namespace.make () in + let open Utilities.Result in + let* () = + List.fold_left + (fun acc entry -> + let* () = acc in + bind into entry ) + (Ok ()) entries + in + Ok into - let namespace entries = - let open Utilities.Result in - let n = Namespace.make () in - let* () = - List.fold_left - (fun acc entry -> - let* () = acc in - bind n entry ) - (Ok ()) entries - in - Ok n +(* A subsystem's root holds what is its own and not data: its + evaluators, and whatever else it registers beside them. *) +let mount root name = + match Path.lookup root Path.(name @/ this) with + | Ok mounted -> Ok mounted + | Error _ -> + let open Utilities.Result in + let* mounted = namespace ["evaluator", Namespace.make ()] in + let* () = bind root (name, mounted) in + Ok mounted - (* \system keeps the head label it had before subsystems got roots of - their own, so a database made then still opens. *) +module Make (S : Abstract.Storage.STORAGE) = struct + module BM = BranchManager.Make (S) + module B = Branch.Make (S) + + (* The heads of \system's branches, of which there is always a master, + are kept under the label rnt-head. *) let initialize ?(evaluators = []) conn = let open Utilities.Result in + let root = Namespace.make () in let* evaluator = namespace evaluators in - let* branch = BM.make ~evaluators:evaluator conn "rnt-head" in + let* branch = BM.make ~root conn "rnt-head" in + let* () = + if Path.lookup branch Path.("master" @/ this) |> Result.is_ok then Ok () + else Result.bind (B.make conn) (fun empty -> bind branch ("master", empty)) + in let* system = namespace [ "branch", branch; @@ -40,13 +57,6 @@ module Make (S : Abstract.Storage.STORAGE) = struct "session", Namespace.make (); "application", Namespace.make () ] in - namespace ["system", system] - - let mount conn root name = - let open Utilities.Result in - let* evaluators = Path.lookup root Source.evaluators in - let* branch = BM.make ~evaluators conn (name ^ "-head") in - let* subsystem = namespace ["branch", branch] in - let* () = bind root (name, subsystem) in - Ok subsystem + let* () = bind root ("system", system) in + Ok root end -- cgit v1.2.3