some functions of Enum are also available for Enum.Gen

This commit is contained in:
Simon Cruanes 2013-03-20 11:55:53 +01:00
parent 1d2e514d45
commit fb75b7299b
2 changed files with 40 additions and 21 deletions

53
enum.ml
View file

@ -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

View file

@ -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} *)