All files / src/laws/typeclass/concrete Semigroup.ts

100% Statements 23/23
100% Branches 2/2
100% Functions 1/1
100% Lines 23/23

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 411x     1x 1x             1x 36x 36x 36x 36x 36x     36x 36x 36x   36x 36x 36x 36x 36x 36x 36x 2942x 36x 36x 36x              
import {Law} from '#law'
import type {SemigroupTypeLambda} from '@effect/typeclass/Semigroup'
import type {BuildConcrete} from './given.js'
import {defineConcreteLaws} from './given.js'
import {associativity} from '#algebra'
import {UnderlyingArbitrary} from '#arbitrary'
 
/**
 * Build typeclass laws for `Semigroup`.
 * @category typeclass laws
 */
export const semigroupLaws: BuildConcrete<SemigroupTypeLambda> = ({
  F,
  equalsA,
  a,
  suffix,
}) => {
  type A = UnderlyingArbitrary<typeof a>
 
  return defineConcreteLaws(
    'Semigroup',
    associativity<A>({a, f: F.combine, equals: equalsA}),
 
    Law(
      'combineMany associativity',
      'combineMany(a, [b, c]) = combine(a, combine(b, c))',
      a,
      a,
      a,
    )((a, b, c) =>
      equalsA(F.combineMany(a, [b, c]), F.combine(a, F.combine(b, c))),
    ),
  )(suffix)
}
 
declare module './given.js' {
  interface ConcreteLambdas {
    Semigroup: SemigroupTypeLambda
  }
}