mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
some functions of Enum are also available for Enum.Gen
This commit is contained in:
parent
1d2e514d45
commit
fb75b7299b
2 changed files with 40 additions and 21 deletions
53
enum.ml
53
enum.ml
|
|
@ -57,6 +57,34 @@ module Gen = struct
|
||||||
|
|
||||||
let length gen =
|
let length gen =
|
||||||
fold (fun acc _ -> acc + 1) 0 gen
|
fold (fun acc _ -> acc + 1) 0 gen
|
||||||
|
|
||||||
|
let of_list l =
|
||||||
|
let l = ref l in
|
||||||
|
fun () ->
|
||||||
|
match !l with
|
||||||
|
| [] -> raise EOG
|
||||||
|
| x::l' -> l := l'; x
|
||||||
|
|
||||||
|
let to_list gen =
|
||||||
|
let rec fold () =
|
||||||
|
try
|
||||||
|
let x = gen () in
|
||||||
|
x :: fold ()
|
||||||
|
with EOG -> []
|
||||||
|
in fold ()
|
||||||
|
|
||||||
|
let to_rev_list gen =
|
||||||
|
fold (fun acc x -> x :: acc) [] gen
|
||||||
|
|
||||||
|
let int_range i j =
|
||||||
|
let r = ref i in
|
||||||
|
fun () ->
|
||||||
|
let x = !r in
|
||||||
|
if x > j then raise EOG
|
||||||
|
else begin
|
||||||
|
incr r;
|
||||||
|
x
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
(** {2 Basic constructors} *)
|
(** {2 Basic constructors} *)
|
||||||
|
|
@ -463,34 +491,17 @@ let powerSet enum =
|
||||||
(** {2 Basic conversion functions} *)
|
(** {2 Basic conversion functions} *)
|
||||||
|
|
||||||
let to_list enum =
|
let to_list enum =
|
||||||
let rec fold gen =
|
Gen.to_list (enum ())
|
||||||
try
|
|
||||||
let x = gen () in
|
|
||||||
x :: fold gen
|
|
||||||
with EOG -> []
|
|
||||||
in fold (enum ())
|
|
||||||
|
|
||||||
let of_list l =
|
let of_list l =
|
||||||
fun () ->
|
fun () ->
|
||||||
let l = ref l in
|
Gen.of_list l
|
||||||
fun () ->
|
|
||||||
match !l with
|
|
||||||
| [] -> raise EOG
|
|
||||||
| x::l' -> l := l'; x
|
|
||||||
|
|
||||||
let to_rev_list enum =
|
let to_rev_list enum =
|
||||||
fold (fun acc x -> x :: acc) [] enum
|
Gen.to_rev_list (enum ())
|
||||||
|
|
||||||
let int_range i j =
|
let int_range i j =
|
||||||
fun () ->
|
fun () -> Gen.int_range i j
|
||||||
let r = ref i in
|
|
||||||
fun () ->
|
|
||||||
let x = !r in
|
|
||||||
if x > j then raise EOG
|
|
||||||
else begin
|
|
||||||
incr r;
|
|
||||||
x
|
|
||||||
end
|
|
||||||
|
|
||||||
let pp ?(start="") ?(stop="") ?(sep=",") ?(horizontal=false) pp_elem formatter enum =
|
let pp ?(start="") ?(stop="") ?(sep=",") ?(horizontal=false) pp_elem formatter enum =
|
||||||
(if horizontal
|
(if horizontal
|
||||||
|
|
|
||||||
8
enum.mli
8
enum.mli
|
|
@ -57,6 +57,14 @@ module Gen : sig
|
||||||
|
|
||||||
val length : 'a generator -> int
|
val length : 'a generator -> int
|
||||||
(** Consume generator to compute its length *)
|
(** Consume generator to compute its length *)
|
||||||
|
|
||||||
|
val of_list : 'a list -> 'a generator
|
||||||
|
|
||||||
|
val to_list : 'a generator -> 'a list (* not tailrec *)
|
||||||
|
|
||||||
|
val to_rev_list : 'a generator -> 'a list
|
||||||
|
|
||||||
|
val int_range : int -> int -> int generator
|
||||||
end
|
end
|
||||||
|
|
||||||
(** {2 Basic constructors} *)
|
(** {2 Basic constructors} *)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue