// @flow import { HKT } from './HKT' import type { Functor } from './Functor' export interface Apply extends Functor { ap(fab: HKT B>, fa: HKT): HKT } export function liftA2(apply: Apply, f: (a: A, b: B) => C): (fa: HKT, fb: HKT) => HKT { const cf = a => b => f(a, b) return (fa, fb) => apply.ap(apply.map(cf, fa), fb) } export function liftA3(apply: Apply, f: (a: A, b: B, c: C) => D): (fa: HKT, fb: HKT, fc: HKT) => HKT { const cf = a => b => c => f(a, b, c) return (fa, fb, fc) => apply.ap(apply.ap(apply.map(cf, fa), fb), fc) } export function liftA4(apply: Apply, f: (a: A, b: B, c: C, d: D) => E): (fa: HKT, fb: HKT, fc: HKT, fd: HKT) => HKT { const cf = a => b => c => d => f(a, b, c, d) return (fa, fb, fc, fd) => apply.ap(apply.ap(apply.ap(apply.map(cf, fa), fb), fc), fd) }