Skip to content

Instantly share code, notes, and snippets.

@effe-megna
Created November 4, 2019 11:57
Show Gist options
  • Select an option

  • Save effe-megna/9e286a576caaaf8e0beded74ae5006db to your computer and use it in GitHub Desktop.

Select an option

Save effe-megna/9e286a576caaaf8e0beded74ae5006db to your computer and use it in GitHub Desktop.
monad TaskRemoteData
import { Monad2 } from 'fp-ts/lib/Monad'
import * as RD from "@devexperts/remote-data-ts"
import * as T from "fp-ts/lib/Task"
import * as TE from "fp-ts/lib/TaskEither"
import * as E from "fp-ts/lib/Either"
import { pipe, pipeable } from "fp-ts/lib/pipeable"
import { sequenceT } from 'fp-ts/lib/Apply'
declare module 'fp-ts/lib/HKT' {
interface URItoKind2<E, A> {
TaskRemoteData: TaskRemoteData<E, A>
}
}
export interface TaskRemoteData<E, A> extends T.Task<RD.RemoteData<E, A>> { }
export const of = <E, A>(a: A): TaskRemoteData<E, A> => T.task.of(RD.remoteData.of<E, A>(a))
export const failure = <E>(e: E): TaskRemoteData<E, never> => T.task.of(RD.failure<E>(e))
export const fromTask = <E, A>(t: T.Task<A>): TaskRemoteData<E, A> =>
pipe(
t,
T.chain(a => of(a))
)
export const fromTaskEither = <E, A>(te: TE.TaskEither<E, A>): TaskRemoteData<E, A> =>
pipe(
te,
TE.fold(
(e) => failure(e),
(v) => of(v)
)
)
export const fromEither = <E, A>(e: E.Either<E, A>): TaskRemoteData<E, A> =>
pipe(
e,
E.fold(
e => failure(e),
v => of(v)
)
)
export const monadTaskRemoteData: Monad2<'TaskRemoteData'> = {
URI: 'TaskRemoteData',
of,
map: (fa, f) => pipe(
fa,
T.map(a =>
pipe(
a,
RD.fold(
() => RD.initial,
() => RD.pending,
(e) => RD.failure(e),
(v) => RD.remoteData.of(f(v))
)
)
)
),
chain: (fa, f) => pipe(
fa,
T.chain(a =>
pipe(
a,
RD.fold(
() => T.task.of(RD.initial),
() => T.task.of(RD.pending),
(e) => T.task.of(RD.failure(e)),
(v) => f(v)
)
)
)
),
ap: (fab, fa) => pipe(
sequenceT(T.task)(
fab,
fa
),
T.map(([fabR, faR]) =>
pipe(
sequenceT(RD.remoteData)(
fabR,
faR
),
RD.map(([toB, a]) => toB(a)),
)
)
)
}
export const TRD = pipeable(
monadTaskRemoteData
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment