All files / src/laws/typeclass/parameterized RightFoldable.ts

100% Statements 33/33
100% Branches 3/3
100% Functions 1/1
100% Lines 33/33

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 47 48 49 50 511x   1x 1x 1x   1x           1x   1x 3x   3x 3x 3x   3x 3x 3x 3x 3x 3x   3x 3x 3x 3x 3x 3x 300x 300x 300x 300x 300x 300x 300x 3x 3x 3x              
import {Law, LawSet} from '#law'
import * as RF from '#typeclass/RightFoldable'
import {Foldable as FO} from '@effect/typeclass'
import {pipe} from 'effect'
import {foldableLaws} from './Foldable.js'
import type {BuildParameterized} from './given.js'
import {unfoldGiven} from './given.js'
 
/**
 * Typeclass laws for `RightFoldable`.
 * @category typeclass laws
 */
export const rightFoldableLaws: BuildParameterized<
  RF.RightFoldableTypeLambda
> = (given, suffix?): LawSet => {
  const {Monoid: monoid, F, fa, endoA, equalsA} = unfoldGiven(given)
 
  const combineMap = pipe(monoid, FO.combineMap(F)),
    {reduceRight} = F,
    {combine} = monoid
 
  return pipe(
    given,
    foldableLaws,
    LawSet,
  )(
    `RightFoldable${suffix ?? ''}`,
 
    Law(
      'reduceRight',
      'reduceRight(∅, (p,a) ⇒ aa(a) ⊕ p) = combineMap(Monoid)(aa)',
      fa,
      endoA,
    )((fa, endoA) =>
      equalsA(
        pipe(
          fa,
          reduceRight(monoid.empty, (p, a) => combine(endoA(a), p)),
        ),
        pipe(fa, combineMap(endoA)),
      ),
    ),
  )
}
 
declare module './given.js' {
  interface ParameterizedLambdas {
    RightFoldable: RF.RightFoldableTypeLambda
  }
}