sig
  type ('a, 'b) enum = { start : unit -> 'a; step : '-> ('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 : ('-> 'b) Join.chan;
    wait : unit -> 'c;
  }
  val create :
    ('d, 'a) JoinPool.Simple.enum ->
    ('-> '-> 'c) -> '-> ('a, 'b, 'c) JoinPool.Simple.t
end