import { curry } from '@typed/lambda'
import { chain } from './chain'
import { map } from './map'
import { Maybe } from './Maybe'
/**
* Applies the function contained in a `Maybe` to the value contained in a
* second `Maybe`.
* @name ap(fn: Maybe<(value: A) => B>, value: Maybe): Maybe
*/
export const ap = curry(__ap) as {
(fn: Maybe<(value: A) => B>, value: Maybe): Maybe
(fn: Maybe<(value: A) => B>): (value: Maybe) => Maybe
}
function __ap(fn: Maybe<(value: A) => B>, maybe: Maybe): Maybe {
return chain((f) => map(f, maybe), fn)
}