diff options
Diffstat (limited to 'lib/kernel/Initialization.ml')
| -rw-r--r-- | lib/kernel/Initialization.ml | 67 |
1 files changed, 53 insertions, 14 deletions
diff --git a/lib/kernel/Initialization.ml b/lib/kernel/Initialization.ml index 3c8addb..518fe4f 100644 --- a/lib/kernel/Initialization.ml +++ b/lib/kernel/Initialization.ml @@ -1,23 +1,62 @@ +module Error = struct + open Concepts.Condition + + let taken name = + condition "name-taken" "A namespace already binds the name" + ("name" |=| Concepts.Value.String name) +end + +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 + +(* 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 + 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 open Protocols in let root = Namespace.make () in - let registry = Registry.from root |> Option.get in - let* branch_manager = BM.make conn "rnt-head" in - let* _ = Registry.update registry "branch" None (Some branch_manager) in - let evaluator_namespace = Namespace.make () in - let evaluator_registry = Registry.from evaluator_namespace |> Option.get in - let* _ = - List.fold_left - (fun acc (name, handle) -> - let* _ = acc in - Registry.update evaluator_registry name None (Some handle) ) - (Ok true) evaluators + let* evaluator = namespace evaluators 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; + "evaluator", evaluator; + "session", Namespace.make (); + "application", Namespace.make () ] in - let* _ = Registry.update registry "evaluator" None (Some evaluator_namespace) in - let* _ = Registry.update registry "session" None (Some (Namespace.make ())) in + let* () = bind root ("system", system) in Ok root end |
