@typed/fp
Version:
Data Structures and Resources for fp-ts
169 lines • 4.21 kB
JavaScript
/**
* Eq Instance for some common scenarios including deep equality.
*
* @since 0.9.2
*/
import fde from 'fast-deep-equal';
import * as B from 'fp-ts/boolean';
import * as D from 'fp-ts/Date';
import * as Eq from 'fp-ts/Eq';
import * as N from 'fp-ts/number';
import * as RA from 'fp-ts/ReadonlyArray';
import * as RR from 'fp-ts/ReadonlyRecord';
import * as S from 'fp-ts/string';
import { constant, constFalse, constTrue } from './function';
import { memoize } from './internal';
/**
* @since 0.9.2
* @category Instance
*/
export const alwaysEqualsEq = { equals: constant(constTrue) };
/**
* @since 0.9.2
* @category Instance
*/
export const neverEqualsEq = { equals: constant(constFalse) };
/**
* A deep-equality Eq instance.
* Supports Reference equality, all JavaScript Primitives including `RegExp`, `Set` and `Map`.
* @since 0.9.2
* @category Instance
*/
export const deepEqualsEq = Eq.fromEquals((b) => (a) => fde(a, b));
// -------------------------------------------------------------------------------------
// primitives
// -------------------------------------------------------------------------------------
/**
* @category primitives
* @since 0.9.5
*/
export const string = S.Eq;
/**
* @category primitives
* @since 0.9.5
*/
export const number = N.Eq;
/**
* @category primitives
* @since 0.9.5
*/
export const boolean = B.Eq;
/**
* @category primitives
* @since 0.9.5
*/
export const unknownArray = Eq.fromEquals((second) => (first) => first.length === second.length);
/**
* @category primitives
* @since 0.9.5
*/
export const unknownRecord = Eq.fromEquals((second) => (first) => {
for (const k in first) {
if (!(k in second)) {
return false;
}
}
for (const k in second) {
if (!(k in first)) {
return false;
}
}
return true;
});
// -------------------------------------------------------------------------------------
// Combinator
// -------------------------------------------------------------------------------------
/**
* @category Combinator
* @since 0.9.5
*/
export const nullable = (or) => Eq.fromEquals((second) => (first) => first === null || second === null ? first === second : or.equals(second)(first));
/**
* @category Combinator
* @since 0.9.5
*/
export const optional = (or) => Eq.fromEquals((second) => (first) => first === undefined || second === undefined ? first === second : or.equals(second)(first));
/**
* @category Combinator
* @since 0.9.5
*/
export const tuple = Eq.tuple;
/**
* @category Combinator
* @since 2.2.15
*/
export const struct = Eq.struct;
/**
* @category Combinator
* @since 0.9.5
*/
export const partial = (properties) => Eq.fromEquals((second) => (first) => {
for (const k in properties) {
const xk = first[k];
const yk = second[k];
if (!(xk === undefined || yk === undefined ? xk === yk : properties[k].equals(xk)(yk))) {
return false;
}
}
return true;
});
/**
* @category Combinator
* @since 0.9.5
*/
export const array = RA.getEq;
/**
* @category Combinator
* @since 0.9.5
*/
export const record = RR.getEq;
/**
* @category Combinator
* @since 0.9.5
*/
export const intersect = (right) => (left) => Eq.fromEquals((second) => (first) => left.equals(second)(first) && right.equals(second)(first));
/**
* @category Combinator
* @since 0.9.5
*/
export function lazy(f) {
const get = memoize(f);
return {
equals: (second) => (first) => get().equals(second)(first),
};
}
/**
* @category Combinator
* @since 0.9.5
*/
export const sum = (tag) => {
return (members) => Eq.fromEquals((second) => (first) => {
const ftag = first[tag];
return ftag === second[tag] && members[ftag].equals(second)(first);
});
};
/**
* @category Instance
* @since 0.9.4
*/
export const Schemable = {
URI: '@typed/fp/ToEq',
string,
number,
boolean,
date: D.Eq,
literal: () => Eq.EqStrict,
tuple,
struct,
array,
record,
nullable,
intersect,
lazy: (_, f) => lazy(f),
sum,
branded: (e) => e,
unknownArray,
unknownRecord,
};
export * from 'fp-ts/Eq';
//# sourceMappingURL=Eq.js.map