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

100% Statements 8/8
100% Branches 2/2
100% Functions 3/3
100% Lines 8/8

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 51                        45x     3x   3x 3x 3x   3x                         300x     479x                          
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
  }
}