import { Apply, ap2 } from './apply' import { $, HKT, kind } from '.' export type ApplicativeInstances = keyof typeof Applicative export interface Applicative extends Apply { pure(v: A): $ } export namespace Applicative { const __name = "Applicative" } export function lift2(fabc: (a: A, b: B) => C): (fa: $, fb: $) => $ { return function(fa: $, fb: $): $ { let instance = Applicative[kind(fa)] as Applicative return ap2(instance.pure(fabc), fa, fb) } }