diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-10-05 22:40:22 -0300 |
|---|---|---|
| committer | Marcos Magueta <maguetamarcos@gmail.com> | 2026-10-05 22:40:22 -0300 |
| commit | cfc641a9bb97c94e5993f895a8bcdf24214adc83 (patch) | |
| tree | c793f068df0ff588565b5819b27018b616b87109 /lib/kernel/View.ml | |
| parent | 32e663591a84d095723e62ef934a0bc6e1470b52 (diff) | |
| download | RNT-journal.tar.gz RNT-journal.zip | |
journal for the websitejournal
Diffstat (limited to 'lib/kernel/View.ml')
| -rw-r--r-- | lib/kernel/View.ml | 44 |
1 files changed, 44 insertions, 0 deletions
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) ) |
