import type * as A from "../Collections/Immutable/Array/index.js";
import type * as Tp from "../Collections/Immutable/Tuple/index.js";
import type * as E from "../Either/index.js";
import type { ForcedTuple } from "../Utils/index.js";
import type { Equal } from "./definition.js";
/**
* Constructs an `Equal[A]` from a function. The instance will be optimized
* to first compare the values for reference equality and then compare the
* values for value equality.
*/
export declare function makeEqual(f: (x: A, y: A) => boolean): Equal;
/**
* Equality for `Any` values. Note that since values of type `Any` contain
* no information, all values of type `Any` can be treated as equal to each
* other.
*/
export declare const any: Equal;
/**
* Equality for `Nothing` values. Note that since there are not values of
* type `Nothing` the `equals` method of this instance can never be called
* but it can be useful in deriving instances for more complex types.
*/
export declare const never: Equal;
/**
* Constructs an `Equal[(A, B)]` given an `Equal[A]` and `Equal[B]` by first
* comparing the `A` values for equality and then comparing the `B` values
* for equality, if necessary.
*/
export declare function both(fb: Equal): (fa: Equal) => Equal>;
/**
* Constructs an `Equal[Either[A, B]]` given an `Equal[A]` and an
* `Equal[B]`. The instance will compare the `Either[A, B]` values and if
* both are `Right` or `Left` compare them for equality.
*/
export declare function orElseEither(fb: () => Equal): (fa: Equal) => Equal>;
/**
* Constructs an `Equal[B]` given an `Equal[A]` and a function `f` to
* transform a `B` value into an `A` value. The instance will convert each
* `B` value into an `A` and the compare the `A` values for equality.
*/
export declare function contramap(f: (a: B) => A): (fa: Equal) => Equal;
/**
* Constructs an `Equal[A]` that uses the default notion of equality
* embodied in the implementation of `equals` for values of type `A`.
*/
export declare function strict(): Equal;
/**
* Equality for `number` values.
*/
export declare const number: Equal;
/**
* Equality for `string` values.
*/
export declare const string: Equal;
/**
* Equality for `symbol` values.
*/
export declare const symbol: Equal;
/**
* Equality for `boolean` values.
*/
export declare const boolean: Equal;
/**
* Equality for `Date` values.
*/
export declare const date: Equal;
/**
* Derives an `Equal[Array[A]]` given an `Equal[A]`.
*/
export declare function array(EqA: Equal): Equal>;
/**
* Given a tuple of `Equal`s returns a `Equal` for the tuple
*/
export declare function tuple>>(...eqs: T): Equal ? A : never;
}>>;
/**
* Given a struct of `Equal`s returns a `Equal` for the struct
*/
export declare function struct>(eqs: {
[K in keyof O]: Equal;
}): Equal;
//# sourceMappingURL=operations.d.ts.map