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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 1x 1x 1x 1x 50399x 816471x 1x 1x 1x 1x 1x 1x 231x 231x 1x 1x 494x 494x 494x 494x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 131x | /**
* Arbitraries for various kinds of functions.
* @module
*/
import {pipe, Predicate as PR} from 'effect'
import type {Kind, TypeLambda} from 'effect/HKT'
import fc from 'fast-check'
import type {LiftArbitrary} from './types.js'
// flipped “apply”
const applyF =
<A, B>(f: (a: A) => B) =>
(a: A): B =>
f(a)
/**
* Calls
* [fc.function](https://fast-check.dev/docs/core-blocks/arbitraries/composites/function/#func)
* but keeps only the first argument making it act as a function of a single
* argument.
* @category arbitraries
*/
export const unary: <A>() => <B>(
b: fc.Arbitrary<B>,
) => fc.Arbitrary<(a: A) => B> = () => b => fc.func(b).map(applyF)
/**
* An arbitrary function from `A` to `A`.
* @category arbitraries
*/
export const endo = <A>(a: fc.Arbitrary<A>): fc.Arbitrary<(a: A) => A> =>
fc.func(a).map(applyF)
/**
* Build an arbitrary binary function of type `(a: A, b: B) => C` from an
* arbitrary of `C`.
* @category arbitraries
*/
export const binary =
<A, B>() =>
<C>(c: fc.Arbitrary<C>): fc.Arbitrary<(a: A, b: B) => C> =>
fc.func(c).map(f => (a: A, b: B) => f(a, b))
/**
* An arbitrary for a function from `A` to `F<B>`. Requires an
* arbitrary of `B`, a function converting arbitraries of `A` to
* arbitraries of `F<A>`, and the _type_ `A`.
* @returns An arbitrary of type `(a: A) => F<B>`.
* @category arbitraries
*/
export const unaryToKind =
<A>() =>
<F extends TypeLambda, R, O, E>(
getArbitrary: LiftArbitrary<F, R, O, E>,
): (<B>(b: fc.Arbitrary<B>) => fc.Arbitrary<(a: A) => Kind<F, R, O, E, B>>) =>
b =>
pipe(b, getArbitrary, fc.func).map(applyF)
/**
* An arbitrary for a function from `F<A>` to `B`. Requires an
* arbitrary of `B` and specifying the kind type parameters.
* @returns An arbitrary of type `(a: F<A>) => B`.
* @category arbitraries
*/
export const unaryFromKind =
<A, F extends TypeLambda, R = never, O = unknown, E = unknown>(): (<B>(
b: fc.Arbitrary<B>,
) => fc.Arbitrary<(fa: Kind<F, R, O, E, A>) => B>) =>
b =>
fc.func(b).map(applyF)
/**
* An arbitrary for the type `F<A⇒B>`. Requires an arbitrary of `B`, a
* function lifting `A` to `F<A>`, and the _type_ `A`.
* @returns An arbitrary of type `F<(a: A) => B>`.
* @category arbitraries
*/
export const unaryInKind =
<A>() =>
<F extends TypeLambda, R = never, O = unknown, E = unknown>(
of: <T>(t: T) => Kind<F, R, O, E, T>,
): (<B>(b: fc.Arbitrary<B>) => fc.Arbitrary<Kind<F, R, O, E, (a: A) => B>>) =>
b =>
unary<A>()(b).map(of)
/**
* An arbitrary predicate of `A`.
* @category arbitraries
*/
export const predicate = <A>(): fc.Arbitrary<PR.Predicate<A>> =>
unary<A>()(fc.boolean())
|