UNPKG

effect-ts-laws

Version:
30 lines 1.55 kB
import { inverse } from '#algebra'; import { Law } from '#law'; import { Isomorphism } from '#typeclass'; import { pipe } from 'effect'; import { defineConcreteLaws } from './given.js'; /** * Build typeclass laws for isomorphisms that share their `A` type parameter. * @category typeclass laws */ export const buildIsomorphismLaws = (base) => (encodings) => { const results = []; for (const entry of Object.entries(encodings)) { const [suffix, entryGiven] = entry; const given = { ...base, ...entryGiven, }; results.push(isomorphismLaws(suffix, given)); } return results; }; /** * Build typeclass laws for `Isomorphism`. * @category typeclass laws */ export const isomorphismLaws = (suffix, { a, b, equalsA, equalsB, F }) => { const [encode, decode] = [Isomorphism.encode(F), Isomorphism.decode(F)]; return defineConcreteLaws('Isomorphism', inverse({ f: encode, g: decode, a, equals: equalsA }, 'F.encode ⚬ F.decode = id', 'decode/encode identity'), inverse({ f: decode, g: encode, a: b, equals: equalsB }, 'F.decode ⚬ F.encode = id', 'encode/decode identity'), Law('reverse compose encode identity', 'compose(F, reverse(F)).encode = id', a)(a => equalsA(Isomorphism.encode(pipe(F, Isomorphism.reverse, Isomorphism.compose(F)))(a), a)), Law('reverse compose decode identity', 'compose(F, reverse(F)).decode = id', a)(a => equalsA(Isomorphism.decode(pipe(F, Isomorphism.reverse, Isomorphism.compose(F)))(a), a)))(suffix); }; //# sourceMappingURL=Isomorphism.js.map