UNPKG

effect-ts-laws

Version:
20 lines 1.46 kB
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