Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 1x 1x 1x 1x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x | import {Law} from '#law' import {Monoid as MO} from '@effect/typeclass' import type {TypeLambda} from 'effect/HKT' import {UnderlyingArbitrary} from '../../../arbitrary.js' import type {BuildConcrete} from './given.js' import {defineConcreteLaws} from './given.js' import {semigroupLaws} from './Semigroup.js' /** * Build typeclass laws for `Monoid` and its requirement `Semigroup` laws. * @category typeclass laws */ export const monoidLaws: BuildConcrete<MonoidTypeLambda> = given => { const {F, equalsA, a, suffix} = given type A = UnderlyingArbitrary<typeof a> return defineConcreteLaws( 'Monoid', Law( 'left identity', '∅ ⊕ a = a', a, )((a: A) => equalsA(F.combine(F.empty, a), a)), Law( 'right identity', 'a = a ⊕ ∅', a, )((a: A) => equalsA(F.combine(a, F.empty), a)), )(suffix, semigroupLaws(given)) } /** * Type lambda for the `Monoid` typeclass. * @category type lambda */ export interface MonoidTypeLambda extends TypeLambda { readonly type: MO.Monoid<this['Target']> } declare module './given.js' { interface ConcreteLambdas { Monoid: MonoidTypeLambda } } |