functor
  (Ops : sig
           type t
           and num_type = Math.integer
           val add : t -> t -> t
           val sub : t -> t -> t
           val succ : t -> t
           val pred : t -> t
           val mul : t -> t -> t
           val div : t -> t -> t
           val rem : t -> t -> t
           val abs : t -> t
           val zero : t
           val one : t
           val min : t
           val max : t
           val print : out_channel -> t -> unit
           val to_float : t -> float
           val of_float : float -> t
         end->
  functor
    (Source : sig
                type t = Ops.t
                val genrand : unit -> Rand.RNGSource.t
                val min : Rand.RNGSource.t
                val max : Rand.RNGSource.t
              end->
    sig
      type t = Source.t
      val min : Rand.IDIST.t
      val max : Rand.IDIST.t
      class rng :
        Rand.IDIST.t ->
        Rand.IDIST.t ->
        object
          method genrand : Rand.IDIST.t
          method max : Rand.IDIST.t
          method min : Rand.IDIST.t
        end
    end