/** * Chain * * 1. m.chain(f).chain(g) is equivalent to m.chain(x => f(x).chain(g)) (associativity) * * chain :: Chain m => m a ~> (a -> m b) -> m b */ import { Apply, Apply1, Apply2 } from './Apply'; import { HKT, KindOf, URIS } from './HKT'; export interface Chain extends Apply { readonly chain: (fa: HKT, f: (a: A) => HKT) => HKT; } export interface Chain1 extends Apply1 { readonly chain: (fa: KindOf, f: (a: A) => KindOf) => KindOf; } export interface Chain2 extends Apply2 { readonly chain: (fa: KindOf, f: (a: A) => KindOf) => KindOf; }