sig
  type ('a, 'b) enum = { start : unit -> 'a; step : 'a -> ('b * 'a) option; }
  val enum_of_interval : int -> int -> (int, int) JoinPool.Simple.enum
  val enum_of_list : 'a list -> ('a list, 'a) JoinPool.Simple.enum
  type ('a, 'b, 'c) t = {
    register : ('a -> 'b) Join.chan;
    wait : unit -> 'c;
  }
  val create :
    ('d, 'a) JoinPool.Simple.enum ->
    ('b -> 'c -> 'c) -> 'c -> ('a, 'b, 'c) JoinPool.Simple.t
end