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