// @flow import { HKT } from './HKT' import type { Apply } from './Apply' export interface Chain extends Apply { chain(f: (a: A) => HKT, fa: HKT): HKT } // Forwards Kleisli composition. // // For example: // // ```js // import * as arr from '../Arr' // // const second = a => composeKleisli(maybe, arr.tail, arr.head) // ``` export function composeKleisli(chain: Chain, f: (a: A) => HKT, g: (b: B) => HKT): (a: A) => HKT { return a => chain.chain(g, f(a)) }