UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

720 lines (701 loc) 24.3 kB
/** * 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<F, 'S'>, R = Initial<F, 'R'>, E = Initial<F, 'E'>, >(P: Pointed4<F>): Kind4<F, S, R, E, D.NoData> export function noData<F extends URIS3, R = Initial<F, 'R'>, E = Initial<F, 'E'>>( P: Pointed3<F>, ): Kind3<F, R, E, D.NoData> export function noData<F extends URIS2, E = Initial<F, 'E'>>(P: Pointed2<F>): Kind2<F, E, D.NoData> export function noData<F extends URIS>(P: Pointed1<F>): Kind<F, D.NoData> export function noData<F>(P: Pointed<F>): HKT<F, D.NoData> export function noData<F>(P: Pointed<F>) { return P.of(D.noData) } /** * @since 0.9.2 * @category Constructor */ export function loading< F extends URIS4, S = Initial<F, 'S'>, R = Initial<F, 'R'>, E = Initial<F, 'E'>, >(P: Pointed4<F>): Kind4<F, S, R, E, D.Loading> export function loading<F extends URIS3, R = Initial<F, 'R'>, E = Initial<F, 'E'>>( P: Pointed3<F>, ): Kind3<F, R, E, D.Loading> export function loading<F extends URIS2, E = Initial<F, 'E'>>( P: Pointed2<F>, ): Kind2<F, E, D.Loading> export function loading<F extends URIS>(P: Pointed1<F>): Kind<F, D.Loading> export function loading<F>(P: Pointed<F>): HKT<F, D.Loading> export function loading<F>(P: Pointed<F>) { return P.of(D.loading) } /** * @since 0.9.2 * @category Constructor */ export function fromProgress< F extends URIS4, S = Initial<F, 'S'>, R = Initial<F, 'R'>, E = Initial<F, 'E'>, >(P: Pointed4<F>): (progress: Progress) => Kind4<F, S, R, E, D.Loading> export function fromProgress<F extends URIS3, R = Initial<F, 'R'>, E = Initial<F, 'E'>>( P: Pointed3<F>, ): (progress: Progress) => Kind3<F, R, E, D.Loading> export function fromProgress<F extends URIS2, E = Initial<F, 'E'>>( P: Pointed2<F>, ): (progress: Progress) => Kind2<F, E, D.Loading> export function fromProgress<F extends URIS>( P: Pointed1<F>, ): (progress: Progress) => Kind<F, D.Loading> export function fromProgress<F>(P: Pointed<F>): (progress: Progress) => HKT<F, D.Loading> export function fromProgress<F>(P: Pointed<F>) { return flow(D.fromProgress, P.of) } /** * @since 0.9.2 * @category Constructor */ export function refresh<F extends URIS4>( P: Pointed4<F>, ): <A, S = Initial<F, 'S'>, R = Initial<F, 'R'>, E = Initial<F, 'E'>>( value: A, progress?: O.Option<Progress>, ) => Kind4<F, S, R, E, D.Refresh<A>> export function refresh<F extends URIS3, E>( P: Pointed3C<F, E>, ): <A, R = Initial<F, 'R'>>(value: A, progress?: O.Option<Progress>) => Kind3<F, R, E, D.Refresh<A>> export function refresh<F extends URIS3>( P: Pointed3<F>, ): <A, R = Initial<F, 'R'>, E = Initial<F, 'E'>>( value: A, progress?: O.Option<Progress>, ) => Kind3<F, R, E, D.Refresh<A>> export function refresh<F extends URIS2, E>( P: Pointed2C<F, E>, ): <A>(value: A, progress?: O.Option<Progress>) => Kind2<F, E, D.Refresh<A>> export function refresh<F extends URIS2>( P: Pointed2<F>, ): <A, E = Initial<F, 'E'>>(value: A, progress?: O.Option<Progress>) => Kind2<F, E, D.Refresh<A>> export function refresh<F extends URIS>( P: Pointed1<F>, ): <A>(value: A, progress?: O.Option<Progress>) => Kind<F, D.Refresh<A>> export function refresh<F>( P: Pointed<F>, ): <A>(value: A, progress?: O.Option<Progress>) => HKT<F, D.Refresh<A>> export function refresh<F>(P: Pointed<F>) { return flow(D.refresh, P.of) } /** * @since 0.9.2 * @category Constructor */ export function replete<F extends URIS4>( P: Pointed4<F>, ): <A, S = Initial<F, 'S'>, R = Initial<F, 'R'>, E = Initial<F, 'E'>>( value: A, ) => Kind4<F, S, R, E, D.Replete<A>> export function replete<F extends URIS3, E>( P: Pointed3C<F, E>, ): <A, R = Initial<F, 'R'>>(value: A) => Kind3<F, R, E, D.Replete<A>> export function replete<F extends URIS3>( P: Pointed3<F>, ): <A, R = Initial<F, 'R'>, E = Initial<F, 'E'>>(value: A) => Kind3<F, R, E, D.Replete<A>> export function replete<F extends URIS2, E>( P: Pointed2C<F, E>, ): <A>(value: A) => Kind2<F, E, D.Replete<A>> export function replete<F extends URIS2>( P: Pointed2<F>, ): <A, E = Initial<F, 'E'>>(value: A) => Kind2<F, E, D.Replete<A>> export function replete<F extends URIS>(P: Pointed1<F>): <A>(value: A) => Kind<F, D.Replete<A>> export function replete<F>(P: Pointed<F>): <A>(value: A) => HKT<F, D.Replete<A>> export function replete<F>(P: Pointed<F>) { return flow(D.replete, P.of) } /** * @since 0.9.2 * @category Constructor */ export function repleteF<F extends URIS4>( F: Functor.Functor4<F>, ): <S, R, E, A>(fa: Kind4<F, S, R, E, A>) => Kind4<F, S, R, E, D.Replete<A>> export function repleteF<F extends URIS3, E>( F: Functor.Functor3C<F, E>, ): <R, A>(fa: Kind3<F, R, E, A>) => Kind3<F, R, E, D.Replete<A>> export function repleteF<F extends URIS3>( F: Functor.Functor3<F>, ): <R, E, A>(fa: Kind3<F, R, E, A>) => Kind3<F, R, E, D.Replete<A>> export function repleteF<F extends URIS2, E>( F: Functor.Functor2C<F, E>, ): <A>(fa: Kind2<F, E, A>) => Kind2<F, E, D.Replete<A>> export function repleteF<F extends URIS2>( F: Functor.Functor2<F>, ): <E, A>(fa: Kind2<F, E, A>) => Kind2<F, E, D.Replete<A>> export function repleteF<F extends URIS>( F: Functor.Functor1<F>, ): <A>(fa: Kind<F, A>) => Kind<F, D.Replete<A>> export function repleteF<F>(F: Functor.Functor<F>): <A>(fa: HKT<F, A>) => HKT<F, D.Replete<A>> export function repleteF<F>(F: Functor.Functor<F>) { return F.map(D.replete) } /** * @since 0.9.2 * @category Combinator */ export function map<F extends URIS4>( F: Functor.Functor4<F>, ): <A, B>( f: (a: A) => B, ) => <S, R, E>(fa: Kind4<F, S, R, E, D.Data<A>>) => Kind4<F, S, R, E, D.Data<B>> export function map<F extends URIS3, E>( F: Functor.Functor3C<F, E>, ): <A, B>(f: (a: A) => B) => <R>(fa: Kind3<F, R, E, D.Data<A>>) => Kind3<F, R, E, D.Data<B>> export function map<F extends URIS3>( F: Functor.Functor3<F>, ): <A, B>(f: (a: A) => B) => <R, E>(fa: Kind3<F, R, E, D.Data<A>>) => Kind3<F, R, E, D.Data<B>> export function map<F extends URIS2, E>( F: Functor.Functor2C<F, E>, ): <A, B>(f: (a: A) => B) => (fa: Kind2<F, E, D.Data<A>>) => Kind2<F, E, D.Data<B>> export function map<F extends URIS2>( F: Functor.Functor2<F>, ): <A, B>(f: (a: A) => B) => <E>(fa: Kind2<F, E, D.Data<A>>) => Kind2<F, E, D.Data<B>> export function map<F extends URIS>( F: Functor.Functor1<F>, ): <A, B>(f: (a: A) => B) => (fa: Kind<F, D.Data<A>>) => Kind<F, D.Data<B>> export function map<F>( F: Functor.Functor<F>, ): <A, B>(f: (a: A) => B) => (fa: HKT<F, D.Data<A>>) => HKT<F, D.Data<B>> export function map<F>(F: Functor.Functor<F>) { return Functor.map(F, D.Functor) } /** * @since 0.9.2 * @category Combinator */ export function ap<F extends URIS4>( F: Apply.Apply4<F>, ): <S1, R1, E1, A>( fa: Kind4<F, S1, R1, E1, D.Data<A>>, ) => <S2, R2, E2, B>( fab: Kind4<F, S2, R2, E2, D.Data<(a: A) => B>>, ) => Kind4< F, ApplyVariance<F, 'S', [S1, S2]>, ApplyVariance<F, 'R', [R1, R2]>, ApplyVariance<F, 'E', [E1, E2]>, D.Data<B> > export function ap<F extends URIS3, E>( F: Apply.Apply3C<F, E>, ): <R1, A>( fa: Kind3<F, R1, E, D.Data<A>>, ) => <R2, B>( fab: Kind3<F, R2, E, D.Data<(a: A) => B>>, ) => Kind3<F, ApplyVariance<F, 'R', [R1, R2]>, E, D.Data<B>> export function ap<F extends URIS3>( F: Apply.Apply3<F>, ): <R1, E1, A>( fa: Kind3<F, R1, E1, D.Data<A>>, ) => <R2, E2, B>( fab: Kind3<F, R2, E2, D.Data<(a: A) => B>>, ) => Kind3<F, ApplyVariance<F, 'R', [R1, R2]>, ApplyVariance<F, 'E', [E1, E2]>, D.Data<B>> export function ap<F extends URIS2, E>( F: Apply.Apply2C<F, E>, ): <A>( fa: Kind2<F, E, D.Data<A>>, ) => <B>(fab: Kind2<F, E, D.Data<(a: A) => B>>) => Kind2<F, E, D.Data<B>> export function ap<F extends URIS2>( F: Apply.Apply2<F>, ): <E1, A>( fa: Kind2<F, E1, D.Data<A>>, ) => <E2, B>( fab: Kind2<F, E2, D.Data<(a: A) => B>>, ) => Kind2<F, ApplyVariance<F, 'E', [E1, E2]>, D.Data<B>> export function ap<F extends URIS>( F: Apply.Apply1<F>, ): <A>(fa: Kind<F, D.Data<A>>) => <B>(fab: Kind<F, D.Data<(a: A) => B>>) => Kind<F, D.Data<B>> export function ap<F>( F: Apply.Apply<F>, ): <A>(fa: HKT<F, D.Data<A>>) => <B>(fab: HKT<F, D.Data<(a: A) => B>>) => HKT<F, D.Data<B>> export function ap<F>(F: Apply.Apply<F>) { return Apply.ap(F, D.Apply) } /** * @since 0.9.2 * @category Combinator */ export function chain<F extends URIS4>( M: Monad.Monad4<F>, ): <A, S1, R1, E1, B>( f: (value: A) => Kind4<F, S1, R1, E1, D.Data<B>>, ) => <S2, R2, E2>( fa: Kind4<F, S2, R2, E2, D.Data<A>>, ) => Kind4< F, ApplyVariance<F, 'S', [S1, S2]>, ApplyVariance<F, 'R', [R1, R2]>, ApplyVariance<F, 'E', [E1, E2]>, D.Data<B> > export function chain<F extends URIS3>( M: Monad.Monad3<F>, ): <A, R1, E1, B>( f: (value: A) => Kind3<F, R1, E1, D.Data<B>>, ) => <R2, E2>( fa: Kind3<F, R2, E2, D.Data<A>>, ) => Kind3<F, ApplyVariance<F, 'R', [R1, R2]>, ApplyVariance<F, 'E', [E1, E2]>, D.Data<B>> export function chain<F extends URIS2>( M: Monad.Monad2<F>, ): <A, E1, B>( f: (value: A) => Kind2<F, E1, D.Data<B>>, ) => <E2>(fa: Kind2<F, E2, D.Data<A>>) => Kind2<F, ApplyVariance<F, 'E', [E1, E2]>, D.Data<B>> export function chain<F extends URIS>( M: Monad.Monad1<F>, ): <A, B>(f: (value: A) => Kind<F, D.Data<B>>) => (fa: Kind<F, D.Data<A>>) => Kind<F, D.Data<B>> export function chain<F>( M: Monad.Monad<F>, ): <A, B>(f: (value: A) => HKT<F, D.Data<B>>) => (fa: HKT<F, D.Data<A>>) => HKT<F, D.Data<B>> export function chain<F>(M: Monad.Monad<F>) { return <A, B>(f: (value: A) => HKT<F, D.Data<B>>) => (fa: HKT<F, D.Data<A>>) => pipe( fa, M.chain((data) => (D.hasValue(data) ? f(data.value) : M.of(data))), ) } /** * @since 0.9.2 * @category Combinator */ export function alt<M extends URIS4>( M: Monad.Monad4<M>, ): <S1, R1, E1, A>( second: Lazy<Kind4<M, S1, R1, E1, D.Data<A>>>, ) => <S2, R2, E2>( first: Kind4<M, S2, R2, E2, D.Data<A>>, ) => Kind4< M, ApplyVariance<M, 'S', [S1, S2]>, ApplyVariance<M, 'R', [R1, R2]>, ApplyVariance<M, 'E', [E1, E2]>, D.Data<A> > export function alt<M extends URIS3>( M: Monad.Monad3<M>, ): <R1, E1, A>( second: Lazy<Kind3<M, R1, E1, D.Data<A>>>, ) => <R2, E2>( first: Kind3<M, R2, E2, D.Data<A>>, ) => Kind3<M, ApplyVariance<M, 'R', [R1, R2]>, ApplyVariance<M, 'E', [E1, E2]>, D.Data<A>> export function alt<M extends URIS2>( M: Monad.Monad2<M>, ): <E1, A>( second: Lazy<Kind2<M, E1, D.Data<A>>>, ) => <E2>(first: Kind2<M, E2, D.Data<A>>) => Kind2<M, ApplyVariance<M, 'E', [E1, E2]>, D.Data<A>> export function alt<M extends URIS>( M: Monad.Monad1<M>, ): <A>(second: Lazy<Kind<M, D.Data<A>>>) => (first: Kind<M, D.Data<A>>) => Kind<M, D.Data<A>> export function alt<M>( M: Monad.Monad<M>, ): <A>(second: Lazy<HKT<M, D.Data<A>>>) => (first: HKT<M, D.Data<A>>) => HKT<M, D.Data<A>> export function alt<M>( M: Monad.Monad<M>, ): <A>(second: Lazy<HKT<M, D.Data<A>>>) => (first: HKT<M, D.Data<A>>) => HKT<M, D.Data<A>> { return (second) => M.chain((e) => (D.hasValue(e) ? M.of(e) : second())) } /** * @since 0.9.2 * @category Deconstructor */ export function match<F extends URIS4>( F: Functor.Functor4<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, onRefresh: (value: B, progress: O.Option<Progress>) => A, onReplete: (value: B) => A, ) => <S, R, E>(fa: Kind4<F, S, R, E, D.Data<B>>) => Kind4<F, S, R, E, A> export function match<F extends URIS3>( F: Functor.Functor3<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, onRefresh: (value: B, progress: O.Option<Progress>) => A, onReplete: (value: B) => A, ) => <R, E>(fa: Kind3<F, R, E, D.Data<B>>) => Kind3<F, R, E, A> export function match<F extends URIS2>( F: Functor.Functor2<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, onRefresh: (value: B, progress: O.Option<Progress>) => A, onReplete: (value: B) => A, ) => <E>(fa: Kind2<F, E, D.Data<B>>) => Kind2<F, E, A> export function match<F extends URIS>( F: Functor.Functor1<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, onRefresh: (value: B, progress: O.Option<Progress>) => A, onReplete: (value: B) => A, ) => (fa: Kind<F, D.Data<B>>) => Kind<F, A> export function match<F>( F: Functor.Functor<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, onRefresh: (value: B, progress: O.Option<Progress>) => A, onReplete: (value: B) => A, ) => (fa: HKT<F, D.Data<B>>) => HKT<F, A> export function match<F>(F: Functor.Functor<F>) { return flow(D.match, F.map) } /** * @since 0.9.2 * @category Deconstructor */ export function matchW<F extends URIS4>( F: Functor.Functor4<F>, ): <A, B, C, D, E>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onRefresh: (value: C, progress: O.Option<Progress>) => D, onReplete: (value: C) => E, ) => <S, R, EF>(fa: Kind4<F, S, R, EF, D.Data<C>>) => Kind4<F, S, R, EF, A | B | D | E> export function matchW<F extends URIS3>( F: Functor.Functor3<F>, ): <A, B, C, D, E>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onRefresh: (value: C, progress: O.Option<Progress>) => D, onReplete: (value: C) => E, ) => <R, EF>(fa: Kind3<F, R, EF, D.Data<C>>) => Kind3<F, R, EF, A | B | D | E> export function matchW<F extends URIS2>( F: Functor.Functor2<F>, ): <A, B, C, D, E>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onRefresh: (value: C, progress: O.Option<Progress>) => D, onReplete: (value: C) => E, ) => <EF>(fa: Kind2<F, EF, D.Data<C>>) => Kind2<F, E, A | B | D | E> export function matchW<F extends URIS>( F: Functor.Functor1<F>, ): <A, B, C, D, E>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onRefresh: (value: C, progress: O.Option<Progress>) => D, onReplete: (value: C) => E, ) => (fa: Kind<F, D.Data<C>>) => Kind<F, A | B | D | E> export function matchW<F>( F: Functor.Functor<F>, ): <A, B, C, D, E>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onRefresh: (value: C, progress: O.Option<Progress>) => D, onReplete: (value: C) => E, ) => (fa: HKT<F, D.Data<C>>) => HKT<F, A | B | D | E> export function matchW<F>(F: Functor.Functor<F>) { return flow(D.matchW, F.map) } /** * @since 0.9.2 * @category Deconstructor */ export function match3W<F extends URIS4>( F: Functor.Functor4<F>, ): <A, B, C, D>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onReplete: (value: C) => D, ) => <S, R, E>(fa: Kind4<F, S, R, E, D.Data<C>>) => Kind4<F, S, R, E, A | B | D> export function match3W<F extends URIS3>( F: Functor.Functor3<F>, ): <A, B, C, D>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onReplete: (value: C) => D, ) => <R, E>(fa: Kind3<F, R, E, D.Data<C>>) => Kind3<F, R, E, A | B | D> export function match3W<F extends URIS2>( F: Functor.Functor2<F>, ): <A, B, C, D>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onReplete: (value: C) => D, ) => <E>(fa: Kind2<F, E, D.Data<C>>) => Kind2<F, E, A | B | D> export function match3W<F extends URIS>( F: Functor.Functor1<F>, ): <A, B, C, D>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onReplete: (value: C) => D, ) => (fa: Kind<F, D.Data<C>>) => Kind<F, A | B | D> export function match3W<F>( F: Functor.Functor<F>, ): <A, B, C, D>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, onReplete: (value: C) => D, ) => (fa: HKT<F, D.Data<C>>) => HKT<F, A | B | D> export function match3W<F>(F: Functor.Functor<F>) { return flow(D.match3W, F.map) } /** * @since 0.9.2 * @category Deconstructor */ export function matchE<F extends URIS4>( C: Chain.Chain4<F>, ): <S1, R1, E1, A, S2, R2, E2, B, S3, R3, E3, S4, R4, E4>( onNoData: () => Kind4<F, S1, R1, E1, A>, onLoading: (progress: O.Option<Progress>) => Kind4<F, S2, R2, E2, A>, onRefresh: (value: B, progress: O.Option<Progress>) => Kind4<F, S3, R3, E3, A>, onReplete: (value: B) => Kind4<F, S4, R4, E4, A>, ) => <S5, R5, E5>( data: Kind4<F, S5, R5, E5, D.Data<B>>, ) => Kind4< F, ApplyVariance<F, 'S', [S1, S2, S3, S4, S5]>, ApplyVariance<F, 'R', [R1, R2, R3, R4, R5]>, ApplyVariance<F, 'E', [E1, E2, E3, E4, E5]>, A > export function matchE<F extends URIS3>( C: Chain.Chain3<F>, ): <R1, E1, A, R2, E2, B, R3, E3, R4, E4>( onNoData: () => Kind3<F, R1, E1, A>, onLoading: (progress: O.Option<Progress>) => Kind3<F, R2, E2, A>, onRefresh: (value: B, progress: O.Option<Progress>) => Kind3<F, R3, E3, A>, onReplete: (value: B) => Kind3<F, R4, E4, A>, ) => <R5, E5>( data: Kind3<F, R5, E5, D.Data<B>>, ) => Kind3< F, ApplyVariance<F, 'R', [R1, R2, R3, R4, R5]>, ApplyVariance<F, 'E', [E1, E2, E3, E4, E5]>, A > export function matchE<F extends URIS2>( C: Chain.Chain2<F>, ): <E1, A, E2, B, E3, E4>( onNoData: () => Kind2<F, E1, A>, onLoading: (progress: O.Option<Progress>) => Kind2<F, E2, A>, onRefresh: (value: B, progress: O.Option<Progress>) => Kind2<F, E3, A>, onReplete: (value: B) => Kind2<F, E4, A>, ) => <E5>(data: Kind2<F, E5, D.Data<B>>) => Kind2<F, ApplyVariance<F, 'E', [E1, E2, E3, E4, E5]>, A> export function matchE<F extends URIS>( C: Chain.Chain1<F>, ): <A, B>( onNoData: () => Kind<F, A>, onLoading: (progress: O.Option<Progress>) => Kind<F, A>, onRefresh: (value: B, progress: O.Option<Progress>) => Kind<F, A>, onReplete: (value: B) => Kind<F, A>, ) => (data: Kind<F, D.Data<B>>) => Kind<F, A> export function matchE<F>( C: Chain.Chain<F>, ): <A, B>( onNoData: () => HKT<F, A>, onLoading: (progress: O.Option<Progress>) => HKT<F, A>, onRefresh: (value: B, progress: O.Option<Progress>) => HKT<F, A>, onReplete: (value: B) => HKT<F, A>, ) => (data: HKT<F, D.Data<B>>) => HKT<F, A> export function matchE<F>(C: Chain.Chain<F>) { return <A, B>( onNoData: () => HKT<F, A>, onLoading: (progress: O.Option<Progress>) => HKT<F, A>, onRefresh: (value: B, progress: O.Option<Progress>) => HKT<F, A>, onReplete: (value: B) => HKT<F, A>, ) => (data: HKT<F, D.Data<B>>) => pipe(data, C.chain(D.matchW(onNoData, onLoading, onRefresh, onReplete))) } /** * @since 0.9.2 * @category Deconstructor */ export function matchEW<F extends URIS4>( C: Chain.Chain4<F>, ): <S1, R1, E1, A, S2, R2, E2, B, C, S3, R3, E3, D, S4, R4, E4, E>( onNoData: () => Kind4<F, S1, R1, E1, A>, onLoading: (progress: O.Option<Progress>) => Kind4<F, S2, R2, E2, B>, onRefresh: (value: C, progress: O.Option<Progress>) => Kind4<F, S3, R3, E3, D>, onReplete: (value: C) => Kind4<F, S4, R4, E4, E>, ) => <S5, R5, E5>( data: Kind4<F, S5, R5, E5, D.Data<C>>, ) => Kind4< F, ApplyVariance<F, 'S', [S1, S2, S3, S4, S5]>, ApplyVariance<F, 'R', [R1, R2, R3, R4, R5]>, ApplyVariance<F, 'E', [E1, E2, E3, E4, E5]>, A | B | D | E > export function matchEW<F extends URIS3>( C: Chain.Chain3<F>, ): <R1, E1, A, R2, E2, B, C, R3, E3, D, R4, E4, E>( onNoData: () => Kind3<F, R1, E1, A>, onLoading: (progress: O.Option<Progress>) => Kind3<F, R2, E2, B>, onRefresh: (value: C, progress: O.Option<Progress>) => Kind3<F, R3, E3, D>, onReplete: (value: C) => Kind3<F, R4, E4, E>, ) => <R5, E5>( data: Kind3<F, R5, E5, D.Data<C>>, ) => Kind3< F, ApplyVariance<F, 'R', [R1, R2, R3, R4, R5]>, ApplyVariance<F, 'E', [E1, E2, E3, E4, E5]>, A | B | D | E > export function matchEW<F extends URIS2>( C: Chain.Chain2<F>, ): <E1, A, E2, B, C, E3, D, E4, E>( onNoData: () => Kind2<F, E1, A>, onLoading: (progress: O.Option<Progress>) => Kind2<F, E2, B>, onRefresh: (value: C, progress: O.Option<Progress>) => Kind2<F, E3, D>, onReplete: (value: C) => Kind2<F, E4, E>, ) => <E5>( data: Kind2<F, E5, D.Data<C>>, ) => Kind2<F, ApplyVariance<F, 'E', [E1, E2, E3, E4, E5]>, A | B | D | E> export function matchEW<F extends URIS>( C: Chain.Chain1<F>, ): <A, B, C, D, E>( onNoData: () => Kind<F, A>, onLoading: (progress: O.Option<Progress>) => Kind<F, B>, onRefresh: (value: C, progress: O.Option<Progress>) => Kind<F, D>, onReplete: (value: C) => Kind<F, E>, ) => (data: Kind<F, D.Data<C>>) => Kind<F, A | B | D | E> export function matchEW<F>( C: Chain.Chain<F>, ): <A, B, C, D, E>( onNoData: () => HKT<F, A>, onLoading: (progress: O.Option<Progress>) => HKT<F, B>, onRefresh: (value: C, progress: O.Option<Progress>) => HKT<F, D>, onReplete: (value: C) => HKT<F, E>, ) => (data: HKT<F, D.Data<C>>) => HKT<F, A | B | D | E> export function matchEW<F>(C: Chain.Chain<F>) { return <A, B, C, D, E>( onNoData: () => HKT<F, A>, onLoading: (progress: O.Option<Progress>) => HKT<F, B>, onRefresh: (value: C, progress: O.Option<Progress>) => HKT<F, D>, onReplete: (value: C) => HKT<F, E>, ) => (data: HKT<F, D.Data<C>>) => pipe( data, C.chain<D.Data<C>, A | B | D | E>(D.matchW(onNoData, onLoading, onRefresh, onReplete)), ) } /** * @since 0.9.2 * @category Combinator */ export function getOrElse<F extends URIS4>( F: Functor.Functor4<F>, ): <A>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, ) => <S, R, E>(ma: Kind4<F, S, R, E, D.Data<A>>) => Kind4<F, S, R, E, A> export function getOrElse<F extends URIS3>( F: Functor.Functor3<F>, ): <A>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, ) => <R, E>(ma: Kind3<F, R, E, D.Data<A>>) => Kind3<F, R, E, A> export function getOrElse<F extends URIS2>( F: Functor.Functor2<F>, ): <A>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, ) => <E>(ma: Kind2<F, E, D.Data<A>>) => Kind2<F, E, A> export function getOrElse<F extends URIS>( F: Functor.Functor1<F>, ): <A>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, ) => (ma: Kind<F, D.Data<A>>) => Kind<F, A> export function getOrElse<F>( F: Functor.Functor<F>, ): <A>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, ) => (ma: HKT<F, D.Data<A>>) => HKT<F, A> export function getOrElse<F>( F: Functor.Functor<F>, ): <A>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => A, ) => (ma: HKT<F, D.Data<A>>) => HKT<F, A> { return flow(D.getOrElse, F.map) } /** * @since 0.9.2 * @category Combinator */ export function getOrElseW<F extends URIS4>( F: Functor.Functor4<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, ) => <S, R, E, C>(ma: Kind4<F, S, R, E, D.Data<C>>) => Kind4<F, S, R, E, A | B | C> export function getOrElseW<F extends URIS3>( F: Functor.Functor3<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, ) => <R, E, C>(ma: Kind3<F, R, E, D.Data<C>>) => Kind3<F, R, E, A | B | C> export function getOrElseW<F extends URIS2>( F: Functor.Functor2<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, ) => <E, C>(ma: Kind2<F, E, D.Data<C>>) => Kind2<F, E, A | B | C> export function getOrElseW<F extends URIS>( F: Functor.Functor1<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, ) => <C>(ma: Kind<F, D.Data<C>>) => Kind<F, C> export function getOrElseW<F>( F: Functor.Functor<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, ) => <C>(ma: HKT<F, D.Data<C>>) => HKT<F, A | B | C> export function getOrElseW<F>( F: Functor.Functor<F>, ): <A, B>( onNoData: () => A, onLoading: (progress: O.Option<Progress>) => B, ) => <C>(ma: HKT<F, D.Data<C>>) => HKT<F, A | B | C> { return (onData, onLoading) => F.map(D.getOrElseW(onData, onLoading)) }