effect-ts-laws
Version:
effect-ts law testing using fast-check.
13 lines • 863 B
JavaScript
import { addLawSets, Law, lawTests } from '#law';
import { flow, identity, pipe } from 'effect';
import { invariantLaws } from './Invariant.js';
import { unfoldGiven } from './given.js';
/**
* Typeclass laws for `Contravariant` and its requirement: `Invariant`.
* @category typeclass laws
*/
export const contravariantLaws = (given, suffix) => {
const { F, equalsFa, fa, ba, cb, equalsFc } = unfoldGiven(given);
return pipe(lawTests(`Contravariant${suffix ?? ''}`, Law('identity', 'contramap(id) = id', fa)(fa => equalsFa(F.contramap(fa, identity), fa)), Law('composition', 'fa ▹ contramap(ba) ▹ contramap(cb) = fa ▹ contramap(ba ∘ cb)', fa, ba, cb)((fa, ba, cb) => equalsFc(pipe(fa, F.contramap(ba), F.contramap(cb)), pipe(fa, F.contramap(flow(cb, ba)))))), pipe(given, invariantLaws, addLawSets));
};
//# sourceMappingURL=Contravariant.js.map