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)
},
}