effect-ts-laws
Version:
effect-ts law testing using fast-check.
20 lines • 1.46 kB
JavaScript
import { Law } from '#law';
import { Boolean as BO } from 'effect';
import { greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo, } from 'effect/Order';
import { defineConcreteLaws } from './given.js';
/**
* Build typeclass laws for `Order`.
* @category typeclass laws
*/
export const orderLaws = ({ F, a, equalsA, suffix, }) => {
const build = buildLaws(a, equalsA), [lt, gt, lte, gte] = [
lessThan(F),
greaterThan(F),
lessThanOrEqualTo(F),
greaterThanOrEqualTo(F),
];
const consistencyLaw = Law('order equals consistency', `∀a,b ∈ T: a≤b ∧ b≥a ⇒ a=c`, a, a)((a, b) => BO.implies(lte(a, b) && gte(a, b), equalsA(a, b)));
return defineConcreteLaws('Order', consistencyLaw)(suffix, build('≤', lte, gt), build('≥', gte, lt));
};
const buildLaws = (a, equalsA) => (sym, op, complement) => defineConcreteLaws('Order', Law('transitivity', `a${sym}b ∧ b${sym}c ⇒ a${sym}c`, a, a, a)((a, b, c) => BO.implies(op(a, b) && op(b, c), op(a, c))), Law('antisymmetry', `a${sym}b ∧ b${sym}a ⇒ a=b`, a, a)((a, b) => BO.implies(op(a, b) && op(b, a), equalsA(a, b))), Law('reflexivity', `a${sym}a`, a)((a) => op(a, a)), Law('connectivity', `a${sym}b ∨ b${sym}a`, a, a)((a, b) => op(a, b) || op(b, a)), Law('complement consistency', `∀a,b ∈ T: a${sym}b ⇒ a${sym === '≤' ? '≯' : '≮'}b`, a, a)((a, b) => BO.implies(op(a, b), !complement(a, b))))(sym);
//# sourceMappingURL=Order.js.map