/** * DataT is a collection of transformers than can lift your effect types * to use Data to represent asynchronous loading. * @since 0.9.2 */ import * as Apply from 'fp-ts/Apply' import * as Chain from 'fp-ts/Chain' import { flow, Lazy, pipe } from 'fp-ts/function' import * as Functor from 'fp-ts/Functor' import { HKT, Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4 } from 'fp-ts/HKT' import * as Monad from 'fp-ts/Monad' import * as O from 'fp-ts/Option' import { Pointed, Pointed1, Pointed2, Pointed2C, Pointed3, Pointed3C, Pointed4, } from 'fp-ts/Pointed' import * as D from './Data' import { ApplyVariance, Initial } from './HKT' import { Progress } from './Progress' /** * @since 0.9.2 * @category Constructor */ export function noData< F extends URIS4, S = Initial, R = Initial, E = Initial, >(P: Pointed4): Kind4 export function noData, E = Initial>( P: Pointed3, ): Kind3 export function noData>(P: Pointed2): Kind2 export function noData(P: Pointed1): Kind export function noData(P: Pointed): HKT export function noData(P: Pointed) { return P.of(D.noData) } /** * @since 0.9.2 * @category Constructor */ export function loading< F extends URIS4, S = Initial, R = Initial, E = Initial, >(P: Pointed4): Kind4 export function loading, E = Initial>( P: Pointed3, ): Kind3 export function loading>( P: Pointed2, ): Kind2 export function loading(P: Pointed1): Kind export function loading(P: Pointed): HKT export function loading(P: Pointed) { return P.of(D.loading) } /** * @since 0.9.2 * @category Constructor */ export function fromProgress< F extends URIS4, S = Initial, R = Initial, E = Initial, >(P: Pointed4): (progress: Progress) => Kind4 export function fromProgress, E = Initial>( P: Pointed3, ): (progress: Progress) => Kind3 export function fromProgress>( P: Pointed2, ): (progress: Progress) => Kind2 export function fromProgress( P: Pointed1, ): (progress: Progress) => Kind export function fromProgress(P: Pointed): (progress: Progress) => HKT export function fromProgress(P: Pointed) { return flow(D.fromProgress, P.of) } /** * @since 0.9.2 * @category Constructor */ export function refresh( P: Pointed4, ): , R = Initial, E = Initial>( value: A, progress?: O.Option, ) => Kind4> export function refresh( P: Pointed3C, ): >(value: A, progress?: O.Option) => Kind3> export function refresh( P: Pointed3, ): , E = Initial>( value: A, progress?: O.Option, ) => Kind3> export function refresh( P: Pointed2C, ): (value: A, progress?: O.Option) => Kind2> export function refresh( P: Pointed2, ): >(value: A, progress?: O.Option) => Kind2> export function refresh( P: Pointed1, ): (value: A, progress?: O.Option) => Kind> export function refresh( P: Pointed, ): (value: A, progress?: O.Option) => HKT> export function refresh(P: Pointed) { return flow(D.refresh, P.of) } /** * @since 0.9.2 * @category Constructor */ export function replete( P: Pointed4, ): , R = Initial, E = Initial>( value: A, ) => Kind4> export function replete( P: Pointed3C, ): >(value: A) => Kind3> export function replete( P: Pointed3, ): , E = Initial>(value: A) => Kind3> export function replete( P: Pointed2C, ): (value: A) => Kind2> export function replete( P: Pointed2, ): >(value: A) => Kind2> export function replete(P: Pointed1): (value: A) => Kind> export function replete(P: Pointed): (value: A) => HKT> export function replete(P: Pointed) { return flow(D.replete, P.of) } /** * @since 0.9.2 * @category Constructor */ export function repleteF( F: Functor.Functor4, ): (fa: Kind4) => Kind4> export function repleteF( F: Functor.Functor3C, ): (fa: Kind3) => Kind3> export function repleteF( F: Functor.Functor3, ): (fa: Kind3) => Kind3> export function repleteF( F: Functor.Functor2C, ): (fa: Kind2) => Kind2> export function repleteF( F: Functor.Functor2, ): (fa: Kind2) => Kind2> export function repleteF( F: Functor.Functor1, ): (fa: Kind) => Kind> export function repleteF(F: Functor.Functor): (fa: HKT) => HKT> export function repleteF(F: Functor.Functor) { return F.map(D.replete) } /** * @since 0.9.2 * @category Combinator */ export function map( F: Functor.Functor4, ): ( f: (a: A) => B, ) => (fa: Kind4>) => Kind4> export function map( F: Functor.Functor3C, ): (f: (a: A) => B) => (fa: Kind3>) => Kind3> export function map( F: Functor.Functor3, ): (f: (a: A) => B) => (fa: Kind3>) => Kind3> export function map( F: Functor.Functor2C, ): (f: (a: A) => B) => (fa: Kind2>) => Kind2> export function map( F: Functor.Functor2, ): (f: (a: A) => B) => (fa: Kind2>) => Kind2> export function map( F: Functor.Functor1, ): (f: (a: A) => B) => (fa: Kind>) => Kind> export function map( F: Functor.Functor, ): (f: (a: A) => B) => (fa: HKT>) => HKT> export function map(F: Functor.Functor) { return Functor.map(F, D.Functor) } /** * @since 0.9.2 * @category Combinator */ export function ap( F: Apply.Apply4, ): ( fa: Kind4>, ) => ( fab: Kind4 B>>, ) => Kind4< F, ApplyVariance, ApplyVariance, ApplyVariance, D.Data > export function ap( F: Apply.Apply3C, ): ( fa: Kind3>, ) => ( fab: Kind3 B>>, ) => Kind3, E, D.Data> export function ap( F: Apply.Apply3, ): ( fa: Kind3>, ) => ( fab: Kind3 B>>, ) => Kind3, ApplyVariance, D.Data> export function ap( F: Apply.Apply2C, ): ( fa: Kind2>, ) => (fab: Kind2 B>>) => Kind2> export function ap( F: Apply.Apply2, ): ( fa: Kind2>, ) => ( fab: Kind2 B>>, ) => Kind2, D.Data> export function ap( F: Apply.Apply1, ): (fa: Kind>) => (fab: Kind B>>) => Kind> export function ap( F: Apply.Apply, ): (fa: HKT>) => (fab: HKT B>>) => HKT> export function ap(F: Apply.Apply) { return Apply.ap(F, D.Apply) } /** * @since 0.9.2 * @category Combinator */ export function chain( M: Monad.Monad4, ): ( f: (value: A) => Kind4>, ) => ( fa: Kind4>, ) => Kind4< F, ApplyVariance, ApplyVariance, ApplyVariance, D.Data > export function chain( M: Monad.Monad3, ): ( f: (value: A) => Kind3>, ) => ( fa: Kind3>, ) => Kind3, ApplyVariance, D.Data> export function chain( M: Monad.Monad2, ): ( f: (value: A) => Kind2>, ) => (fa: Kind2>) => Kind2, D.Data> export function chain( M: Monad.Monad1, ): (f: (value: A) => Kind>) => (fa: Kind>) => Kind> export function chain( M: Monad.Monad, ): (f: (value: A) => HKT>) => (fa: HKT>) => HKT> export function chain(M: Monad.Monad) { return (f: (value: A) => HKT>) => (fa: HKT>) => pipe( fa, M.chain((data) => (D.hasValue(data) ? f(data.value) : M.of(data))), ) } /** * @since 0.9.2 * @category Combinator */ export function alt( M: Monad.Monad4, ): ( second: Lazy>>, ) => ( first: Kind4>, ) => Kind4< M, ApplyVariance, ApplyVariance, ApplyVariance, D.Data > export function alt( M: Monad.Monad3, ): ( second: Lazy>>, ) => ( first: Kind3>, ) => Kind3, ApplyVariance, D.Data> export function alt( M: Monad.Monad2, ): ( second: Lazy>>, ) => (first: Kind2>) => Kind2, D.Data> export function alt( M: Monad.Monad1, ): (second: Lazy>>) => (first: Kind>) => Kind> export function alt( M: Monad.Monad, ): (second: Lazy>>) => (first: HKT>) => HKT> export function alt( M: Monad.Monad, ): (second: Lazy>>) => (first: HKT>) => HKT> { return (second) => M.chain((e) => (D.hasValue(e) ? M.of(e) : second())) } /** * @since 0.9.2 * @category Deconstructor */ export function match( F: Functor.Functor4, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, onRefresh: (value: B, progress: O.Option) => A, onReplete: (value: B) => A, ) => (fa: Kind4>) => Kind4 export function match( F: Functor.Functor3, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, onRefresh: (value: B, progress: O.Option) => A, onReplete: (value: B) => A, ) => (fa: Kind3>) => Kind3 export function match( F: Functor.Functor2, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, onRefresh: (value: B, progress: O.Option) => A, onReplete: (value: B) => A, ) => (fa: Kind2>) => Kind2 export function match( F: Functor.Functor1, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, onRefresh: (value: B, progress: O.Option) => A, onReplete: (value: B) => A, ) => (fa: Kind>) => Kind export function match( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, onRefresh: (value: B, progress: O.Option) => A, onReplete: (value: B) => A, ) => (fa: HKT>) => HKT export function match(F: Functor.Functor) { return flow(D.match, F.map) } /** * @since 0.9.2 * @category Deconstructor */ export function matchW( F: Functor.Functor4, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onRefresh: (value: C, progress: O.Option) => D, onReplete: (value: C) => E, ) => (fa: Kind4>) => Kind4 export function matchW( F: Functor.Functor3, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onRefresh: (value: C, progress: O.Option) => D, onReplete: (value: C) => E, ) => (fa: Kind3>) => Kind3 export function matchW( F: Functor.Functor2, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onRefresh: (value: C, progress: O.Option) => D, onReplete: (value: C) => E, ) => (fa: Kind2>) => Kind2 export function matchW( F: Functor.Functor1, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onRefresh: (value: C, progress: O.Option) => D, onReplete: (value: C) => E, ) => (fa: Kind>) => Kind export function matchW( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onRefresh: (value: C, progress: O.Option) => D, onReplete: (value: C) => E, ) => (fa: HKT>) => HKT export function matchW(F: Functor.Functor) { return flow(D.matchW, F.map) } /** * @since 0.9.2 * @category Deconstructor */ export function match3W( F: Functor.Functor4, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onReplete: (value: C) => D, ) => (fa: Kind4>) => Kind4 export function match3W( F: Functor.Functor3, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onReplete: (value: C) => D, ) => (fa: Kind3>) => Kind3 export function match3W( F: Functor.Functor2, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onReplete: (value: C) => D, ) => (fa: Kind2>) => Kind2 export function match3W( F: Functor.Functor1, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onReplete: (value: C) => D, ) => (fa: Kind>) => Kind export function match3W( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, onReplete: (value: C) => D, ) => (fa: HKT>) => HKT export function match3W(F: Functor.Functor) { return flow(D.match3W, F.map) } /** * @since 0.9.2 * @category Deconstructor */ export function matchE( C: Chain.Chain4, ): ( onNoData: () => Kind4, onLoading: (progress: O.Option) => Kind4, onRefresh: (value: B, progress: O.Option) => Kind4, onReplete: (value: B) => Kind4, ) => ( data: Kind4>, ) => Kind4< F, ApplyVariance, ApplyVariance, ApplyVariance, A > export function matchE( C: Chain.Chain3, ): ( onNoData: () => Kind3, onLoading: (progress: O.Option) => Kind3, onRefresh: (value: B, progress: O.Option) => Kind3, onReplete: (value: B) => Kind3, ) => ( data: Kind3>, ) => Kind3< F, ApplyVariance, ApplyVariance, A > export function matchE( C: Chain.Chain2, ): ( onNoData: () => Kind2, onLoading: (progress: O.Option) => Kind2, onRefresh: (value: B, progress: O.Option) => Kind2, onReplete: (value: B) => Kind2, ) => (data: Kind2>) => Kind2, A> export function matchE( C: Chain.Chain1, ): ( onNoData: () => Kind, onLoading: (progress: O.Option) => Kind, onRefresh: (value: B, progress: O.Option) => Kind, onReplete: (value: B) => Kind, ) => (data: Kind>) => Kind export function matchE( C: Chain.Chain, ): ( onNoData: () => HKT, onLoading: (progress: O.Option) => HKT, onRefresh: (value: B, progress: O.Option) => HKT, onReplete: (value: B) => HKT, ) => (data: HKT>) => HKT export function matchE(C: Chain.Chain) { return ( onNoData: () => HKT, onLoading: (progress: O.Option) => HKT, onRefresh: (value: B, progress: O.Option) => HKT, onReplete: (value: B) => HKT, ) => (data: HKT>) => pipe(data, C.chain(D.matchW(onNoData, onLoading, onRefresh, onReplete))) } /** * @since 0.9.2 * @category Deconstructor */ export function matchEW( C: Chain.Chain4, ): ( onNoData: () => Kind4, onLoading: (progress: O.Option) => Kind4, onRefresh: (value: C, progress: O.Option) => Kind4, onReplete: (value: C) => Kind4, ) => ( data: Kind4>, ) => Kind4< F, ApplyVariance, ApplyVariance, ApplyVariance, A | B | D | E > export function matchEW( C: Chain.Chain3, ): ( onNoData: () => Kind3, onLoading: (progress: O.Option) => Kind3, onRefresh: (value: C, progress: O.Option) => Kind3, onReplete: (value: C) => Kind3, ) => ( data: Kind3>, ) => Kind3< F, ApplyVariance, ApplyVariance, A | B | D | E > export function matchEW( C: Chain.Chain2, ): ( onNoData: () => Kind2, onLoading: (progress: O.Option) => Kind2, onRefresh: (value: C, progress: O.Option) => Kind2, onReplete: (value: C) => Kind2, ) => ( data: Kind2>, ) => Kind2, A | B | D | E> export function matchEW( C: Chain.Chain1, ): ( onNoData: () => Kind, onLoading: (progress: O.Option) => Kind, onRefresh: (value: C, progress: O.Option) => Kind, onReplete: (value: C) => Kind, ) => (data: Kind>) => Kind export function matchEW( C: Chain.Chain, ): ( onNoData: () => HKT, onLoading: (progress: O.Option) => HKT, onRefresh: (value: C, progress: O.Option) => HKT, onReplete: (value: C) => HKT, ) => (data: HKT>) => HKT export function matchEW(C: Chain.Chain) { return ( onNoData: () => HKT, onLoading: (progress: O.Option) => HKT, onRefresh: (value: C, progress: O.Option) => HKT, onReplete: (value: C) => HKT, ) => (data: HKT>) => pipe( data, C.chain, A | B | D | E>(D.matchW(onNoData, onLoading, onRefresh, onReplete)), ) } /** * @since 0.9.2 * @category Combinator */ export function getOrElse( F: Functor.Functor4, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, ) => (ma: Kind4>) => Kind4 export function getOrElse( F: Functor.Functor3, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, ) => (ma: Kind3>) => Kind3 export function getOrElse( F: Functor.Functor2, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, ) => (ma: Kind2>) => Kind2 export function getOrElse( F: Functor.Functor1, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, ) => (ma: Kind>) => Kind export function getOrElse( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, ) => (ma: HKT>) => HKT export function getOrElse( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => A, ) => (ma: HKT>) => HKT { return flow(D.getOrElse, F.map) } /** * @since 0.9.2 * @category Combinator */ export function getOrElseW( F: Functor.Functor4, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, ) => (ma: Kind4>) => Kind4 export function getOrElseW( F: Functor.Functor3, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, ) => (ma: Kind3>) => Kind3 export function getOrElseW( F: Functor.Functor2, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, ) => (ma: Kind2>) => Kind2 export function getOrElseW( F: Functor.Functor1, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, ) => (ma: Kind>) => Kind export function getOrElseW( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, ) => (ma: HKT>) => HKT export function getOrElseW( F: Functor.Functor, ): ( onNoData: () => A, onLoading: (progress: O.Option) => B, ) => (ma: HKT>) => HKT { return (onData, onLoading) => F.map(D.getOrElseW(onData, onLoading)) }