sig
  module type Equatable =
    sig
      type 'a t
      val equal :
        'Reins.Types.Poly.Equatable.t ->
        'Reins.Types.Poly.Equatable.t -> bool
    end
  module type Comparable =
    sig
      type 'a t
      val compare :
        ('-> '-> int) ->
        'Reins.Types.Poly.Comparable.t ->
        'Reins.Types.Poly.Comparable.t -> int
      val to_string :
        ('-> string) -> 'Reins.Types.Poly.Comparable.t -> string
    end
  module type Hashable =
    sig type 'a t val equal : 'a t -> 'a t -> bool val hash : 'a t -> int end
  module type Arbitrary =
    sig
      type 'a t
      val gen :
        (?size:int -> Random.State.t -> 'a) ->
        ?size:int -> Random.State.t -> 'Reins.Types.Poly.Arbitrary.t
      val to_string :
        ('-> string) -> 'Reins.Types.Poly.Arbitrary.t -> string
    end
  module type ArbitraryComparable =
    sig
      type 'a t
      val gen :
        (?size:int -> Random.State.t -> 'a) ->
        ?size:int -> Random.State.t -> 'a t
      val to_string : ('-> string) -> 'a t -> string
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
    end
  module ComposeComparable :
    functor (A : Comparable->
      functor (B : Comparable->
        sig
          type 'a t = 'B.t A.t
          val compare :
            ('-> '-> int) ->
            'Reins.Types.Poly.ComposeComparable.t ->
            'Reins.Types.Poly.ComposeComparable.t -> int
          val to_string :
            ('-> string) ->
            'Reins.Types.Poly.ComposeComparable.t -> string
        end
  module ComposeGen :
    functor (A : Arbitrary->
      functor (B : Arbitrary->
        sig
          type 'a t = 'B.t A.t
          val gen :
            (?size:int -> Random.State.t -> 'a) ->
            ?size:int -> Random.State.t -> 'Reins.Types.Poly.ComposeGen.t
          val to_string :
            ('-> string) -> 'Reins.Types.Poly.ComposeGen.t -> string
        end
  module ComposeGenComparable :
    functor (A : ArbitraryComparable->
      functor (B : ArbitraryComparable->
        sig
          type 'a t = 'B.t A.t
          val gen :
            (?size:int -> Random.State.t -> 'a) ->
            ?size:int ->
            Random.State.t -> 'Reins.Types.Poly.ComposeGenComparable.t
          val to_string :
            ('-> string) ->
            'Reins.Types.Poly.ComposeGenComparable.t -> string
          val compare :
            ('-> '-> int) ->
            'Reins.Types.Poly.ComposeGenComparable.t ->
            'Reins.Types.Poly.ComposeGenComparable.t -> int
        end
  module Close :
    sig
      type 'a t = 'a
      val to_string : ('-> 'b) -> '-> 'b
      val compare : ('-> '-> 'c) -> '-> '-> 'c
    end
end