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 =
|
||||
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
|
||||
|
||||
(** {2 Basic constructors} *)
|
||||
|
|
@ -463,34 +491,17 @@ let powerSet enum =
|
|||
(** {2 Basic conversion functions} *)
|
||||
|
||||
let to_list enum =
|
||||
let rec fold gen =
|
||||
try
|
||||
let x = gen () in
|
||||
x :: fold gen
|
||||
with EOG -> []
|
||||
in fold (enum ())
|
||||
Gen.to_list (enum ())
|
||||
|
||||
let of_list l =
|
||||
fun () ->
|
||||
let l = ref l in
|
||||
fun () ->
|
||||
match !l with
|
||||
| [] -> raise EOG
|
||||
| x::l' -> l := l'; x
|
||||
Gen.of_list l
|
||||
|
||||
let to_rev_list enum =
|
||||
fold (fun acc x -> x :: acc) [] enum
|
||||
Gen.to_rev_list (enum ())
|
||||
|
||||
let int_range i j =
|
||||
fun () ->
|
||||
let r = ref i in
|
||||
fun () ->
|
||||
let x = !r in
|
||||
if x > j then raise EOG
|
||||
else begin
|
||||
incr r;
|
||||
x
|
||||
end
|
||||
fun () -> Gen.int_range i j
|
||||
|
||||
let pp ?(start="") ?(stop="") ?(sep=",") ?(horizontal=false) pp_elem formatter enum =
|
||||
(if horizontal
|
||||
|
|
|
|||
8
enum.mli
8
enum.mli
|
|
@ -57,6 +57,14 @@ module Gen : sig
|
|||
|
||||
val length : 'a generator -> int
|
||||
(** 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
|
||||
|
||||
(** {2 Basic constructors} *)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue