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 | 1x 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
}
}
|