UNPKG

@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">

66 lines (52 loc) 1.54 kB
// @flow import { HKT } from './HKT' import type { HKT2 } from './HKT' import type { Semigroupoid } from './Semigroupoid' import type { Functor } from './Functor' import type { Bifunctor } from './Bifunctor' import type { Extend } from './Extend' import type { Comonad } from './Comonad' class IsTuple {} export type TupleV<A, B> = [A, B]; export type Tuple<A, B> = HKT2<IsTuple, A, B>; export function inj<A, B>(t: TupleV<A, B>): Tuple<A, B> { return ((t: any): Tuple<A, B>) } export function prj<A, B>(ft: Tuple<A, B>): TupleV<A, B> { return ((ft: any): TupleV<A, B>) } export function fst<A, B>(t: Tuple<A, B>): A { return prj(t)[0] } export function snd<A, B>(t: Tuple<A, B>): B { return prj(t)[1] } export function compose<A, B, C>(x: Tuple<B, C>, y: Tuple<A, B>): Tuple<A, C> { return inj([fst(y), snd(x)]) } export function map<A, B, C>(f: (a: A) => B, fa: Tuple<C, A>): Tuple<C, B> { const a = prj(fa) return inj([a[0], f(a[1])]) } export function bimap<A, B, C, D>(f: (a: A) => B, g: (c: C) => D, fac: Tuple<A, C>): Tuple<B, D> { const ac = prj(fac) return inj([f(ac[0]), g(ac[1])]) } export function extend<X, A, B>(f: (ea: Tuple<X, A>) => B, ea: Tuple<X, A>): Tuple<X, B> { const t = prj(ea) return inj([t[0], f(ea)]) } export const extract = snd if (false) { // eslint-disable-line ({ map, compose, bimap, extend, extract }: Semigroupoid<IsTuple> & Functor<HKT<IsTuple, *>> & Bifunctor<IsTuple> & Extend<HKT<IsTuple, *>> & Comonad<HKT<IsTuple, *>>) }