All files / src/laws/typeclass/monomorphic build.ts

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

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      1x 1x                     1x 1x 15x   15x           15x   15x 15x 15x 15x  
import {LawSet} from '#law'
import type {TypeLambda} from 'effect/HKT'
import type {TypeclassInstances} from '../build.js'
import {buildTypeclassLawsFor} from '../build.js'
import {MonomorphicGivenOf, unfoldMonomorphicGiven} from './given.js'
 
/**
 * Build monomorphic typeclass laws for the given instances of some
 * higher-kinded data type `F` with a single covariant underlying type `A`.
 * @param given - Test options for the datatype under test.
 * @returns Array of LawSets full of typeclass laws for the instance under test.
 * @property contravariant - Test contravariant typeclass laws on the given
 * instances.
 * @category harness
 */
export const buildMonomorphicLaws =
  <F extends TypeLambda, A, R = never, O = unknown, E = unknown>(
    given: MonomorphicGivenOf<F, A, R, O, E>,
  ) =>
  <Ins extends TypeclassInstances<F, A, R, O, E>>(
    /**
     * Instances to test. Key is typeclass name and value is the
     * instance under test. For example, `{ Monad: Option.Monad }` will run
     * the monad typeclass laws on `Option`.
     */
    instances: Ins,
  ): LawSet[] =>
    buildTypeclassLawsFor<F, Ins, A, A, A, R, O, E>(
      instances,
      unfoldMonomorphicGiven<F, A, R, O, E>(given),
    )