effect-ts-laws
Version:
effect-ts law testing using fast-check.
30 lines • 1.55 kB
JavaScript
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