effect-ts-laws
Version:
effect-ts law testing using fast-check.
18 lines • 1.83 kB
JavaScript
import { addLawSets, Law, lawTests } from '#law';
import { Foldable as FO } from '@effect/typeclass';
import { Monad as identityMonad } from '@effect/typeclass/data/Identity';
import { Foldable as optionFoldable } from '@effect/typeclass/data/Option';
import { Array as AR, identity, pipe } from 'effect';
import { Endo } from '../../../typeclass.js';
import { withOuterOption } from './compose.js';
import { unfoldGiven } from './given.js';
/**
* Typeclass laws for `Foldable`.
* @category typeclass laws
*/
export const foldableLaws = (given, suffix) => pipe(buildLaws(`Foldable${suffix ?? ''}`, given), addLawSets(buildLaws(...withOuterOption('Foldable', given, optionFoldable))));
const buildLaws = (name, given) => {
const { Monoid: monoid, F, fa, b, bab, equalsA, equalsB } = unfoldGiven(given), { reduce } = F, toArray = FO.toArray(F), equalsArrayA = AR.getEquivalence(equalsA), reduceKind = FO.reduceKind(F), { empty, combine } = monoid, combineMap = pipe(monoid, FO.combineMap(F)), arrayAppend = (accumulator, value) => AR.append(accumulator, value);
return pipe(lawTests(name, Law('reduce', 'reduce(b, bab) = combineMap(Monoid<Endo<B>>)(a ⇒ b ⇒ bab(b, a))', fa, b, bab)((fa, empty, combine) => equalsB(pipe(fa, reduce(empty, combine)), pipe(empty, pipe(fa, pipe(Endo.getMonoid(), FO.combineMap(F))(a => b => combine(b, a)))))), Law('combineMap', 'reduce(∅, ⊕) = combineMap(Monoid)(id)', fa)(fa => equalsA(pipe(fa, reduce(empty, combine)), pipe(fa, combineMap(identity)))), Law('reduceKind', 'reduceKind(Monad<Id>) = reduce', fa, b, bab)((fa, b, bab) => equalsB(pipe(fa, reduceKind(identityMonad)(b, bab)), pipe(fa, reduce(b, bab)))), Law('toArray', 'toArray = reduce([], Array.append)', fa)(fa => equalsArrayA(toArray(fa), pipe(fa, reduce([], arrayAppend))))));
};
//# sourceMappingURL=Foldable.js.map