(*  AUTOGENERATED FROM CCEqualLabels.mli  *)

(* This file is free software, part of containers. See file "license" for more details. *)

(** Equality Combinators *)

(** @since 1.2 *)

type 'a t = 'a -> 'a -> bool
(** Equality function. Must be transitive, symmetric, and reflexive. *)

val poly : 'a t
(** Standard polymorphic equality. *)

val physical : 'a t
(** Standard physical equality.
    @since 2.0 *)

val int : int t
val string : string t
val bool : bool t
val float : float t
val unit : unit t
val list : 'a t -> 'a list t
val array : 'a t -> 'a array t
val option : 'a t -> 'a option t
val pair : 'a t -> 'b t -> ('a * 'b) t
val triple : 'a t -> 'b t -> 'c t -> ('a * 'b * 'c) t

val map : ('a -> 'b) -> 'b t -> 'a t
(** [map f eq] is the equality function that, given objects [x] and [y],
    projects [x] and [y] using [f] (e.g. using a record field) and then
    compares those projections with [eq].
    Example:
    [map fst int] compares values of type [(int * 'a)]  by their
      first component. *)

val always_eq : _ t
(** Always returns true. All values are equal.
    @since 3.0 *)

val never_eq : _ t
(** Always returns false. No values are, so this
    is not even reflexive (i.e. [x=x] is false).
    Be careful!
    @since 3.0 *)

module Infix : sig
  val ( >|= ) : 'b t -> ('a -> 'b) -> 'a t
  (** Infix equivalent of {!map}. *)
end

include module type of Infix
