|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /**
- * The `Eq` type class represents types which support decidable equality.
- *
- * Instances must satisfy the following laws:
- *
- * 1. Reflexivity: `E.equals(a, a) === true`
- * 2. Symmetry: `E.equals(a, b) === E.equals(b, a)`
- * 3. Transitivity: if `E.equals(a, b) === true` and `E.equals(b, c) === true`, then `E.equals(a, c) === true`
- *
- * @since 2.0.0
- */
- import { Contravariant1 } from './Contravariant'
- import { Monoid } from './Monoid'
- import { ReadonlyRecord } from './ReadonlyRecord'
- import { Semigroup } from './Semigroup'
- /**
- * @category model
- * @since 2.0.0
- */
- export interface Eq<A> {
- readonly equals: (x: A, y: A) => boolean
- }
- /**
- * @category constructors
- * @since 2.0.0
- */
- export declare const fromEquals: <A>(equals: (x: A, y: A) => boolean) => Eq<A>
- /**
- * @since 2.10.0
- */
- export declare const struct: <A>(eqs: { [K in keyof A]: Eq<A[K]> }) => Eq<{ readonly [K_1 in keyof A]: A[K_1] }>
- /**
- * Given a tuple of `Eq`s returns a `Eq` for the tuple
- *
- * @example
- * import { tuple } from 'fp-ts/Eq'
- * import * as S from 'fp-ts/string'
- * import * as N from 'fp-ts/number'
- * import * as B from 'fp-ts/boolean'
- *
- * const E = tuple(S.Eq, N.Eq, B.Eq)
- * assert.strictEqual(E.equals(['a', 1, true], ['a', 1, true]), true)
- * assert.strictEqual(E.equals(['a', 1, true], ['b', 1, true]), false)
- * assert.strictEqual(E.equals(['a', 1, true], ['a', 2, true]), false)
- * assert.strictEqual(E.equals(['a', 1, true], ['a', 1, false]), false)
- *
- * @since 2.10.0
- */
- export declare const tuple: <A extends readonly unknown[]>(...eqs: { [K in keyof A]: Eq<A[K]> }) => Eq<Readonly<A>>
- /**
- * A typical use case for `contramap` would be like, given some `User` type, to construct an `Eq<User>`.
- *
- * We can do so with a function from `User -> X` where `X` is some value that we know how to compare
- * for equality (meaning we have an `Eq<X>`)
- *
- * For example, given the following `User` type, we want to construct an `Eq<User>` that just looks at the `key` field
- * for each user (since it's known to be unique).
- *
- * If we have a way of comparing `UUID`s for equality (`eqUUID: Eq<UUID>`) and we know how to go from `User -> UUID`,
- * using `contramap` we can do this
- *
- * @example
- * import { contramap, Eq } from 'fp-ts/Eq'
- * import { pipe } from 'fp-ts/function'
- * import * as S from 'fp-ts/string'
- *
- * type UUID = string
- *
- * interface User {
- * readonly key: UUID
- * readonly firstName: string
- * readonly lastName: string
- * }
- *
- * const eqUUID: Eq<UUID> = S.Eq
- *
- * const eqUserByKey: Eq<User> = pipe(
- * eqUUID,
- * contramap((user) => user.key)
- * )
- *
- * assert.deepStrictEqual(
- * eqUserByKey.equals(
- * { key: 'k1', firstName: 'a1', lastName: 'b1' },
- * { key: 'k2', firstName: 'a1', lastName: 'b1' }
- * ),
- * false
- * )
- * assert.deepStrictEqual(
- * eqUserByKey.equals(
- * { key: 'k1', firstName: 'a1', lastName: 'b1' },
- * { key: 'k1', firstName: 'a2', lastName: 'b1' }
- * ),
- * true
- * )
- *
- * @since 2.0.0
- */
- export declare const contramap: <A, B>(f: (b: B) => A) => (fa: Eq<A>) => Eq<B>
- /**
- * @category type lambdas
- * @since 2.0.0
- */
- export declare const URI = 'Eq'
- /**
- * @category type lambdas
- * @since 2.0.0
- */
- export declare type URI = typeof URI
- declare module './HKT' {
- interface URItoKind<A> {
- readonly [URI]: Eq<A>
- }
- }
- /**
- * @category instances
- * @since 2.5.0
- */
- export declare const eqStrict: Eq<unknown>
- /**
- * @category instances
- * @since 2.10.0
- */
- export declare const getSemigroup: <A>() => Semigroup<Eq<A>>
- /**
- * @category instances
- * @since 2.6.0
- */
- export declare const getMonoid: <A>() => Monoid<Eq<A>>
- /**
- * @category instances
- * @since 2.7.0
- */
- export declare const Contravariant: Contravariant1<URI>
- /**
- * Use [`tuple`](#tuple) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const getTupleEq: <T extends ReadonlyArray<Eq<any>>>(
- ...eqs: T
- ) => Eq<{
- [K in keyof T]: T[K] extends Eq<infer A> ? A : never
- }>
- /**
- * Use [`struct`](#struct) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const getStructEq: <O extends ReadonlyRecord<string, any>>(eqs: {
- [K in keyof O]: Eq<O[K]>
- }) => Eq<O>
- /**
- * Use [`eqStrict`](#eqstrict) instead
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const strictEqual: <A>(a: A, b: A) => boolean
- /**
- * This instance is deprecated, use small, specific instances instead.
- * For example if a function needs a `Contravariant` instance, pass `E.Contravariant` instead of `E.eq`
- * (where `E` is from `import E from 'fp-ts/Eq'`)
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const eq: Contravariant1<URI>
- /**
- * Use [`Eq`](./boolean.ts.html#eq) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const eqBoolean: Eq<boolean>
- /**
- * Use [`Eq`](./string.ts.html#eq) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const eqString: Eq<string>
- /**
- * Use [`Eq`](./number.ts.html#eq) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const eqNumber: Eq<number>
- /**
- * Use [`Eq`](./Date.ts.html#eq) instead.
- *
- * @category zone of death
- * @since 2.0.0
- * @deprecated
- */
- export declare const eqDate: Eq<Date>
|