diff --git a/enum.ml b/enum.ml index 4156e626..58e94068 100644 --- a/enum.ml +++ b/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 diff --git a/enum.mli b/enum.mli index 789fbc49..66ff9bb9 100644 --- a/enum.mli +++ b/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} *)