sig
  type 'a bound_t = [ `of '| `of '| `u ]
  type ('a, 'b) bounding_f =
      bounds:'BatBounded.bound_t * 'BatBounded.bound_t -> '-> 'b
  val bounding_of_ord :
    default_low:'->
    default_high:'->
    ('-> 'b) ->
    ('-> '-> BatOrd.order) -> ('a, 'b) BatBounded.bounding_f
  val bounding_of_ord_chain :
    low:('-> 'b) ->
    high:('-> 'b) ->
    ('-> 'b) ->
    ('-> '-> BatOrd.order) -> ('a, 'b) BatBounded.bounding_f
  val saturate_of_ord :
    bounds:'BatBounded.bound_t * 'BatBounded.bound_t ->
    ('-> '-> BatOrd.order) -> '-> 'a
  val opt_of_ord :
    bounds:'BatBounded.bound_t * 'BatBounded.bound_t ->
    ('-> '-> BatOrd.order) -> '-> 'a option
  module type BoundedType =
    sig
      type base_t
      type t
      val bounds :
        BatBounded.BoundedType.base_t BatBounded.bound_t *
        BatBounded.BoundedType.base_t BatBounded.bound_t
      val bounded :
        (BatBounded.BoundedType.base_t, BatBounded.BoundedType.t)
        BatBounded.bounding_f
      val base_of_t :
        BatBounded.BoundedType.t -> BatBounded.BoundedType.base_t option
      val base_of_t_exn :
        BatBounded.BoundedType.t -> BatBounded.BoundedType.base_t
    end
  module type BoundedNumericType =
    sig
      type base_t
      type t
      val bounds : base_t bound_t * base_t bound_t
      val bounded : (base_t, t) bounding_f
      val base_of_t : t -> base_t option
      val base_of_t_exn : t -> base_t
      module Infix :
        sig
          val ( + ) : base_t -> base_t -> base_t
          val ( - ) : base_t -> base_t -> base_t
          val ( * ) : base_t -> base_t -> base_t
          val ( / ) : base_t -> base_t -> base_t
          val ( ** ) : base_t -> base_t -> base_t
          val ( -- ) : base_t -> base_t -> base_t BatEnum.t
          val ( --- ) : base_t -> base_t -> base_t BatEnum.t
        end
    end
  module type S =
    sig
      type base_u
      type u
      type t = private BatBounded.S.u
      val bounds :
        BatBounded.S.base_u BatBounded.bound_t *
        BatBounded.S.base_u BatBounded.bound_t
      val make : BatBounded.S.base_u -> BatBounded.S.t
      external extract : BatBounded.S.t -> BatBounded.S.u = "%identity"
      val map :
        (BatBounded.S.base_u -> BatBounded.S.base_u) ->
        BatBounded.S.t -> BatBounded.S.t option
      val map2 :
        (BatBounded.S.base_u -> BatBounded.S.base_u -> BatBounded.S.base_u) ->
        BatBounded.S.t -> BatBounded.S.t -> BatBounded.S.t option
      val map_exn :
        (BatBounded.S.base_u -> BatBounded.S.base_u) ->
        BatBounded.S.t -> BatBounded.S.t
      val map2_exn :
        (BatBounded.S.base_u -> BatBounded.S.base_u -> BatBounded.S.base_u) ->
        BatBounded.S.t -> BatBounded.S.t -> BatBounded.S.t
    end
  module type NumericSig =
    sig
      type base_u
      type u
      type t = private u
      val bounds : base_u bound_t * base_u bound_t
      val make : base_u -> t
      external extract : t -> u = "%identity"
      val map : (base_u -> base_u) -> t -> t option
      val map2 : (base_u -> base_u -> base_u) -> t -> t -> t option
      val map_exn : (base_u -> base_u) -> t -> t
      val map2_exn : (base_u -> base_u -> base_u) -> t -> t -> t
      val ( + ) : t -> base_u -> t
      val ( - ) : t -> base_u -> t
      val ( * ) : t -> base_u -> t
      val ( / ) : t -> base_u -> t
      val ( +: ) : t -> t -> t
      val ( -: ) : t -> t -> t
      val ( *: ) : t -> t -> t
      val ( /: ) : t -> t -> t
    end
  module Make :
    functor (M : BoundedType->
      sig
        type base_u = M.base_t
        type u = M.t
        type t = private M.t
        val bounds : base_u bound_t * base_u bound_t
        val make : base_u -> t
        external extract : t -> u = "%identity"
        val map : (base_u -> base_u) -> t -> t option
        val map2 : (base_u -> base_u -> base_u) -> t -> t -> t option
        val map_exn : (base_u -> base_u) -> t -> t
        val map2_exn : (base_u -> base_u -> base_u) -> t -> t -> t
      end
  module MakeNumeric :
    functor (M : BoundedNumericType->
      sig
        type base_u = M.base_t
        type u = M.t
        type t = private M.t
        val bounds : base_u bound_t * base_u bound_t
        val make : base_u -> t
        external extract : t -> u = "%identity"
        val map : (base_u -> base_u) -> t -> t option
        val map2 : (base_u -> base_u -> base_u) -> t -> t -> t option
        val map_exn : (base_u -> base_u) -> t -> t
        val map2_exn : (base_u -> base_u -> base_u) -> t -> t -> t
        val ( + ) : t -> base_u -> t
        val ( - ) : t -> base_u -> t
        val ( * ) : t -> base_u -> t
        val ( / ) : t -> base_u -> t
        val ( +: ) : t -> t -> t
        val ( -: ) : t -> t -> t
        val ( *: ) : t -> t -> t
        val ( /: ) : t -> t -> t
      end
end