import fc, { Arbitrary } from 'fast-check' import { Monad1 } from 'fp-ts/lib/Monad' export const URI = 'Arbitrary' export type URI = typeof URI declare module 'fp-ts/lib/HKT' { interface URItoKind { Arbitrary: Arbitrary } } export const arbitrary: Monad1 = { URI, of(a: A) { return fc.constant(a) }, map(fa: Arbitrary, f: (a: A) => B) { return fa.map(f) }, ap(fab: Arbitrary<(a: A) => B>, fa: Arbitrary) { return fab.chain(ab => fa.map(ab)) }, chain(fa: Arbitrary, f: (a: A) => Arbitrary) { return fa.chain(f) }, }