diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-10-11 00:17:53 -0300 |
|---|---|---|
| committer | Marcos Magueta <maguetamarcos@gmail.com> | 2026-10-11 00:17:53 -0300 |
| commit | 470491974d1498a1982a4e4b3560370bdf3d8c27 (patch) | |
| tree | ba4208b73b3f921545df4e0101747f083d8c0602 /lib/evaluators | |
| parent | 0161187d843c84011749139a85c0eb31685bbc4c (diff) | |
| parent | 90e41279094c26e6fcc93966708374b8ceba80e4 (diff) | |
| download | RNT-470491974d1498a1982a4e4b3560370bdf3d8c27.tar.gz RNT-470491974d1498a1982a4e4b3560370bdf3d8c27.zip | |
merge lifecycle-ergonomics and rework modes and contain checks
Diffstat (limited to 'lib/evaluators')
| -rw-r--r-- | lib/evaluators/FOL.ml | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/lib/evaluators/FOL.ml b/lib/evaluators/FOL.ml index 8f44818..9e204a9 100644 --- a/lib/evaluators/FOL.ml +++ b/lib/evaluators/FOL.ml @@ -121,6 +121,17 @@ let rec describe = | _ -> Error (Error.not_a_relation (Protocols.Handle.to_string relation)) ) | Project (plan, attributes) -> describe plan |> fmap (restrict attributes) +let rec modes = + let open Utilities.Result in + function + | Base relation -> + let* relation = Protocols.Relation.require relation in + Protocols.Relation.modes relation + | Project (plan, attributes) -> + modes plan + |> Result.map + (Concepts.Mode.project (BatSet.String.of_list (BatFingerTree.to_list attributes))) + let enumerate relation = let open Utilities.Result in let* enumerable = Protocols.Enumerable.require relation in @@ -154,24 +165,30 @@ let project description relation = in Ok (Kernel.Generator.cursor_of ~finally:(fun () -> Protocols.Handle.release cursor) produce) -let derive relation description enumerate = - Kernel.EphemeralRelation.instantiate ~inputs:[relation] description +let contains relation tuple = + Result.bind (Protocols.Relation.require relation) (fun r -> Protocols.Relation.contains r tuple) + +let derive ?decide relation description modes enumerate = + Kernel.EphemeralRelation.instantiate ~inputs:[relation] ?decide + ~modes:(fun () -> Ok modes) + description {Kernel.EphemeralRelation.name= None; schematics= `Temporary description; program= None} (fun () -> enumerate relation) let rec execute plan = let open Utilities.Result in let* description = describe plan in + let* modes = modes plan in match plan with | Base relation -> let* relation = Protocols.Handle.copy relation |> Option.to_result ~none:(Error.released_relation (Protocols.Handle.to_string relation)) in - Ok (derive relation description enumerate) + Ok (derive ~decide:(contains relation) relation description modes enumerate) | Project (plan, _) -> let* relation = execute plan in - Ok (derive relation description (project description)) + Ok (derive relation description modes (project description)) class evaluator = object (self) |
