// @flow import { HKT } from './HKT' import type { HKT2 } from './HKT' import type { Monad } from './Monad' class IsEff {} export type EffV = () => A; export type Eff = HKT2; export type EffF = HKT; export type Pure = Eff<{}, A>; export function inj(a: EffV): Eff { return ((a: any): Eff) } export function prj(fa: Eff): EffV { return ((fa: any): EffV) } export function runEff(eff: Eff): A { return prj(eff)() } export function runPure(pure: Pure): A { return runEff(pure) } export function map(f: (a: A) => B, fa: Eff): Eff { return inj(() => f(runEff(fa))) } export function ap(fab: Eff B>, fa: Eff): Eff { return inj(() => runEff(fab)(runEff(fa))) } export function of(a: A): Eff { return inj(() => a) } export function chain(f: (a: A) => Eff, fa: Eff): Eff { return inj(() => runEff(f(runEff(fa)))) } if (false) { // eslint-disable-line ({ map, ap, of, chain }: Monad) }