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