@dillonkearns/elm-graphql
Version:
<img src="https://cdn.jsdelivr.net/gh/martimatix/logo-graphqelm/logo.svg" alt="dillonearns/elm-graphql logo" width="40%" align="right">
56 lines (41 loc) • 1.16 kB
Flow
// @flow
import { HKT } from './HKT'
import type { HKT2 } from './HKT'
import type { Monad } from './Monad'
class IsEff {}
export type EffV<A> = () => A;
export type Eff<E, A> = HKT2<IsEff, E, A>;
export type EffF = HKT<IsEff, *>;
export type Pure<A> = Eff<{}, A>;
export function inj<E, A>(a: EffV<A>): Eff<E, A> {
return ((a: any): Eff<E, A>)
}
export function prj<E, A>(fa: Eff<E, A>): EffV<A> {
return ((fa: any): EffV<A>)
}
export function runEff<E, A>(eff: Eff<E, A>): A {
return prj(eff)()
}
export function runPure<A>(pure: Pure<A>): A {
return runEff(pure)
}
export function map<E, A, B>(f: (a: A) => B, fa: Eff<E, A>): Eff<E, B> {
return inj(() => f(runEff(fa)))
}
export function ap<E1, E2, E: E1 & E2, A, B>(fab: Eff<E1, (a: A) => B>, fa: Eff<E2, A>): Eff<E, B> {
return inj(() => runEff(fab)(runEff(fa)))
}
export function of<E, A>(a: A): Eff<E, A> {
return inj(() => a)
}
export function chain<E1, E2, E: E1 & E2, A, B>(f: (a: A) => Eff<E1, B>, fa: Eff<E2, A>): Eff<E, B> {
return inj(() => runEff(f(runEff(fa))))
}
if (false) { // eslint-disable-line
({
map,
ap,
of,
chain
}: Monad<EffF>)
}