import { Compact } from '@typed/common' import { Arity1, curry } from '@typed/lambda' import { chain } from './chain' import { Future } from './Future' import { map } from './map' export const ap = curry(__ap) as { (fn: Future>, value: Future): Future< Compact, A, C > (fn: Future>): ( value: Future, ) => Future, A, C> } function __ap( fn: Future>, value: Future, ): Future, A, C> { return chain((f) => map(f, value), fn) }