"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.eqDate = exports.eqNumber = exports.eqString = exports.eqBoolean = exports.eq = exports.strictEqual = exports.getStructEq = exports.getTupleEq = exports.Contravariant = exports.getMonoid = exports.getSemigroup = exports.eqStrict = exports.URI = exports.contramap = exports.tuple = exports.struct = exports.fromEquals = void 0; var function_1 = require("./function"); // ------------------------------------------------------------------------------------- // constructors // ------------------------------------------------------------------------------------- /** * @category constructors * @since 2.0.0 */ var fromEquals = function (equals) { return ({ equals: function (x, y) { return x === y || equals(x, y); } }); }; exports.fromEquals = fromEquals; // ------------------------------------------------------------------------------------- // combinators // ------------------------------------------------------------------------------------- /** * @since 2.10.0 */ var struct = function (eqs) { return (0, exports.fromEquals)(function (first, second) { for (var key in eqs) { if (!eqs[key].equals(first[key], second[key])) { return false; } } return true; }); }; exports.struct = struct; /** * 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 */ var tuple = function () { var eqs = []; for (var _i = 0; _i < arguments.length; _i++) { eqs[_i] = arguments[_i]; } return (0, exports.fromEquals)(function (first, second) { return eqs.every(function (E, i) { return E.equals(first[i], second[i]); }); }); }; exports.tuple = tuple; /* istanbul ignore next */ var contramap_ = function (fa, f) { return (0, function_1.pipe)(fa, (0, exports.contramap)(f)); }; /** * A typical use case for `contramap` would be like, given some `User` type, to construct an `Eq`. * * 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`) * * For example, given the following `User` type, we want to construct an `Eq` 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`) 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 = S.Eq * * const eqUserByKey: Eq = 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 */ var contramap = function (f) { return function (fa) { return (0, exports.fromEquals)(function (x, y) { return fa.equals(f(x), f(y)); }); }; }; exports.contramap = contramap; /** * @category type lambdas * @since 2.0.0 */ exports.URI = 'Eq'; /** * @category instances * @since 2.5.0 */ exports.eqStrict = { equals: function (a, b) { return a === b; } }; var empty = { equals: function () { return true; } }; /** * @category instances * @since 2.10.0 */ var getSemigroup = function () { return ({ concat: function (x, y) { return (0, exports.fromEquals)(function (a, b) { return x.equals(a, b) && y.equals(a, b); }); } }); }; exports.getSemigroup = getSemigroup; /** * @category instances * @since 2.6.0 */ var getMonoid = function () { return ({ concat: (0, exports.getSemigroup)().concat, empty: empty }); }; exports.getMonoid = getMonoid; /** * @category instances * @since 2.7.0 */ exports.Contravariant = { URI: exports.URI, contramap: contramap_ }; // ------------------------------------------------------------------------------------- // deprecated // ------------------------------------------------------------------------------------- /** * Use [`tuple`](#tuple) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ exports.getTupleEq = exports.tuple; /** * Use [`struct`](#struct) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ exports.getStructEq = exports.struct; /** * Use [`eqStrict`](#eqstrict) instead * * @category zone of death * @since 2.0.0 * @deprecated */ exports.strictEqual = exports.eqStrict.equals; /** * 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 */ exports.eq = exports.Contravariant; /** * Use [`Eq`](./boolean.ts.html#eq) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ exports.eqBoolean = exports.eqStrict; /** * Use [`Eq`](./string.ts.html#eq) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ exports.eqString = exports.eqStrict; /** * Use [`Eq`](./number.ts.html#eq) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ exports.eqNumber = exports.eqStrict; /** * Use [`Eq`](./Date.ts.html#eq) instead. * * @category zone of death * @since 2.0.0 * @deprecated */ exports.eqDate = { equals: function (first, second) { return first.valueOf() === second.valueOf(); } };