aboutsummaryrefslogtreecommitdiffstats
path: root/lib/protocols/Enumerable.ml
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/protocols/Enumerable.ml2
-rw-r--r--lib/protocols/Enumerable.mli7
2 files changed, 9 insertions, 0 deletions
diff --git a/lib/protocols/Enumerable.ml b/lib/protocols/Enumerable.ml
index 53db834..76b4e86 100644
--- a/lib/protocols/Enumerable.ml
+++ b/lib/protocols/Enumerable.ml
@@ -19,3 +19,5 @@ let make impl = Enumerable (impl :> implementation)
let from handle = Handle.into handle (function Enumerable impl -> Some impl | _ -> None)
let require handle = from handle |> Option.to_result ~none:(Error.not_enumerable ())
let enumerate i = Handle.invoke i (fun o -> o#enumerate)
+let cursor handle = Result.bind (require handle) enumerate
+let scan handle f = Result.bind (cursor handle) (fun cursor -> Cursor.consuming cursor f)
diff --git a/lib/protocols/Enumerable.mli b/lib/protocols/Enumerable.mli
index 2c0ee69..a0c1f1c 100644
--- a/lib/protocols/Enumerable.mli
+++ b/lib/protocols/Enumerable.mli
@@ -8,3 +8,10 @@ val make : #implementation -> Handle.protocol
val from : Handle.t -> t Handle.interface option
val require : Handle.t -> (t Handle.interface, Concepts.Condition.condition) result
val enumerate : t Handle.interface -> (Handle.t, Concepts.Condition.condition) result
+val cursor : Handle.t -> (Handle.t, Concepts.Condition.condition) result
+
+(** [f] over a cursor on [handle], released once [f] returns. *)
+val scan :
+ Handle.t ->
+ (Cursor.t Handle.interface -> ('a, Concepts.Condition.condition) result) ->
+ ('a, Concepts.Condition.condition) result