Created
November 4, 2019 11:57
-
-
Save effe-megna/9e286a576caaaf8e0beded74ae5006db to your computer and use it in GitHub Desktop.
monad TaskRemoteData
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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