From cfc641a9bb97c94e5993f895a8bcdf24214adc83 Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Mon, 5 Oct 2026 22:40:22 -0300 Subject: journal for the website --- lib/kernel/View.ml | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 lib/kernel/View.ml (limited to 'lib/kernel/View.ml') diff --git a/lib/kernel/View.ml b/lib/kernel/View.ml new file mode 100644 index 0000000..b90afef --- /dev/null +++ b/lib/kernel/View.ml @@ -0,0 +1,44 @@ +type heading = Protocols.Schematics.attribute_description BatMap.String.t +type rows = (Concepts.Tuple.t list, Concepts.Condition.condition) result + +let ephemeral heading enumerate = + EphemeralRelation.instantiate heading + {EphemeralRelation.name= None; schematics= `Temporary heading; program= None} + (fun () -> + Result.map + (fun tuples -> Generator.cursor_of (fun ~yield -> List.iter yield tuples; Ok ())) + (enumerate ()) ) + +let fixed heading tuples = ephemeral heading (fun () -> Ok tuples) + +let computed heading ~current compute = + let open Utilities.Result in + let now = ephemeral heading (fun () -> current () |> fmap compute) in + Prototype.mixture + ( Protocols.Derived.make + object + method within directory = Ok (ephemeral heading (fun () -> compute directory)) + end + :: Protocols.Handle.protocols now ) + +let read relation = + let open Utilities.Result in + let* schematics = Protocols.Handle.require Protocols.Schematics.from relation in + let* description = Protocols.Schematics.describe schematics in + let* heading = + match description with + | Protocols.Schematics.Relation heading -> Ok heading + | _ -> + Error + Concepts.Condition.( + condition "not-a-relation" "The object does not describe itself as a relation" + ("object" |=| Concepts.Value.String (Protocols.Handle.to_string relation)) ) + in + let* enumerable = Protocols.Enumerable.require relation in + let* cursor = Protocols.Enumerable.enumerate enumerable in + Fun.protect + ~finally:(fun () -> Protocols.Handle.release cursor) + (fun () -> + let* scan = Protocols.Cursor.require cursor in + let* tuples = Protocols.Cursor.drain scan () in + Ok (heading, BatFingerTree.to_list tuples) ) -- cgit v1.2.3