@typed/fp
Version:
Data Structures and Resources for fp-ts
546 lines (501 loc) • 10.7 kB
text/typescript
/**
* StateEnvEither is a StateT of ReaderStreamEither. A Stream-based altenative to
* StateReaderTaskEither that support cancelation and multiple values over time.
* @since 0.9.2
*/
import { Applicative4 } from 'fp-ts/Applicative'
import { Apply4 } from 'fp-ts/Apply'
import { Chain4 } from 'fp-ts/Chain'
import { ChainRec4 } from 'fp-ts/ChainRec'
import * as E from 'fp-ts/Either'
import { FromEither4 } from 'fp-ts/FromEither'
import * as FEi from 'fp-ts/FromEither'
import { FromIO4 } from 'fp-ts/FromIO'
import * as FIO from 'fp-ts/FromIO'
import { FromReader4 } from 'fp-ts/FromReader'
import * as FR from 'fp-ts/FromReader'
import { FromState4 } from 'fp-ts/FromState'
import * as FS from 'fp-ts/FromState'
import { FromTask4 } from 'fp-ts/FromTask'
import * as FT from 'fp-ts/FromTask'
import { flow, pipe } from 'fp-ts/function'
import { Functor4 } from 'fp-ts/Functor'
import { IO } from 'fp-ts/IO'
import { Monad4 } from 'fp-ts/Monad'
import { Pointed4 } from 'fp-ts/Pointed'
import * as ST from 'fp-ts/StateT'
import { Task } from 'fp-ts/Task'
import { Env } from './Env'
import { FromEnv4 } from './FromEnv'
import * as FE from './FromEnv'
import { FromResume4 } from './FromResume'
import * as FRe from './FromResume'
import { MonadRec4 } from './MonadRec'
import { Provide4, ProvideAll4, ProvideSome4, UseAll4, UseSome4 } from './Provide'
import { Reader } from './Reader'
import * as RSE from './ReaderStreamEither'
import * as R from './Resume'
/**
* @since 0.9.2
* @category Model
*/
export interface StateReaderStreamEither<S, R, E, A> {
(state: S): RSE.ReaderStreamEither<R, E, readonly [value: A, nextState: S]>
}
/**
* @since 0.9.2
* @category Combinator
*/
export const ap = ST.ap(RSE.Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const chain = ST.chain(RSE.Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const evaluate = ST.evaluate(RSE.Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const execute = ST.execute(RSE.Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromEnvEither = ST.fromF(RSE.Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromState = ST.fromState(RSE.Pointed)
/**
* @since 0.9.2
* @category Combinator
*/
export const map = ST.map(RSE.Functor)
/**
* @since 0.9.2
* @category Constructor
*/
export const of = ST.of(RSE.Pointed)
/**
* @since 0.9.2
* @category URI
*/
export const URI = '@typed/fp/StateReaderStreamEither'
/**
* @since 0.9.2
* @category URI
*/
export type URI = typeof URI
declare module 'fp-ts/HKT' {
export interface URItoKind4<S, R, E, A> {
[URI]: StateReaderStreamEither<S, R, E, A>
}
}
declare module './HKT' {
export interface URItoVariance {
[URI]: V<R, Contravariant> & V<E, Covariant>
}
}
/**
* @since 0.9.2
* @category Instance
*/
export const Pointed: Pointed4<URI> = {
of,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Functor: Functor4<URI> = {
map,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Apply: Apply4<URI> = {
...Functor,
ap,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Applicative: Applicative4<URI> = {
...Apply,
...Pointed,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Chain: Chain4<URI> = {
...Functor,
chain,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Monad: Monad4<URI> = {
...Chain,
...Pointed,
}
/**
* @since 0.9.2
* @category Combinator
*/
export const chainRec =
<A, S, R, E, B>(f: (a: A) => StateReaderStreamEither<S, R, E, E.Either<A, B>>) =>
(value: A): StateReaderStreamEither<S, R, E, B> =>
flow(
f(value),
RSE.chain(([either, nextState]) =>
pipe(
either,
E.matchW(
(a) => chainRec(f)(a)(nextState),
(b) => RSE.right([b, nextState]),
),
),
),
)
/**
* @since 0.9.2
* @category Instance
*/
export const ChainRec: ChainRec4<URI> = {
chainRec,
}
/**
* @since 0.9.2
* @category Instance
*/
export const MonadRec: MonadRec4<URI> = {
...Monad,
chainRec,
}
/**
* @since 0.9.2
* @category Constructor
*/
export const fromEither = <E, A, S = unknown, R = unknown>(
either: E.Either<E, A>,
): StateReaderStreamEither<S, R, E, A> => fromEnvEither(RSE.fromEither(either))
/**
* @since 0.9.2
* @category Instance
*/
export const FromEither: FromEither4<URI> = {
fromEither,
}
/**
* @since 0.9.2
* @category Constructor
*/
export const fromIO = <A, S = unknown, R = unknown, E = never>(
io: IO<A>,
): StateReaderStreamEither<S, R, E, A> => fromEnvEither(RSE.fromIO(io))
/**
* @since 0.9.2
* @category Instance
*/
export const FromIO: FromIO4<URI> = {
fromIO,
}
/**
* @since 0.9.2
* @category Constructor
*/
export const fromTask = <A, S = unknown, R = unknown, E = never>(
io: Task<A>,
): StateReaderStreamEither<S, R, E, A> => fromEnvEither(RSE.fromTask(io))
/**
* @since 0.9.2
* @category INstance
*/
export const FromTask: FromTask4<URI> = {
...FromIO,
fromTask,
}
/**
* @since 0.9.2
* @category Constructor
*/
export const fromResume = <A, S = unknown, R = unknown, E = never>(
resume: R.Resume<A>,
): StateReaderStreamEither<S, R, E, A> => fromEnvEither(RSE.fromResume(resume))
/**
* @since 0.9.2
* @category Instance
*/
export const FromResume: FromResume4<URI> = {
fromResume,
}
/**
* @since 0.9.2
* @category Constructor
*/
export const fromEnv = <R, A, S = unknown, E = never>(
env: Env<R, A>,
): StateReaderStreamEither<S, R, E, A> => fromEnvEither(RSE.fromEnv(env))
/**
* @since 0.9.2
* @category Instance
*/
export const FromEnv: FromEnv4<URI> = {
fromEnv,
}
/**
* @since 0.9.2
* @category Instance
*/
export const FromState: FromState4<URI> = {
fromState,
}
/**
* @since 0.9.2
* @category Constructor
*/
export const fromReader = <R, A, S = unknown, E = never>(
reader: Reader<R, A>,
): StateReaderStreamEither<S, R, E, A> => fromEnvEither(RSE.fromReader(reader))
/**
* @since 0.9.2
* @category Instance
*/
export const FromReader: FromReader4<URI> = { fromReader }
/**
* @since 0.9.2
* @category Constructor
*/
export const ask = FR.ask(FromReader)
/**
* @since 0.9.2
* @category Constructor
*/
export const asks = FR.asks(FromReader)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainReaderK = FR.chainReaderK(FromReader, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromReaderK = FR.fromReaderK(FromReader)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainFirstResumeK = FRe.chainFirstResumeK(FromResume, Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainResumeK = FRe.chainResumeK(FromResume, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromResumeK = FRe.fromResumeK(FromResume)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainEnvK = FE.chainEnvK(FromEnv, Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainFirstEnvK = FE.chainFirstEnvK(FromEnv, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromEnvK = FE.fromEnvK(FromEnv)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainFirstTaskK = FT.chainFirstTaskK(FromTask, Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainTaskK = FT.chainTaskK(FromTask, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromTaskK = FT.fromTaskK(FromTask)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainFirstIOK = FIO.chainFirstIOK(FromTask, Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainIOK = FIO.chainIOK(FromTask, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromIOK = FIO.fromIOK(FromTask)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainEitherK = FEi.chainEitherK(FromEither, Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainOptionK = FEi.chainOptionK(FromEither, Chain)
/**
* @since 0.9.2
* @category Combinator
*/
export const filterOrElse = FEi.filterOrElse(FromEither, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromEitherK = FEi.fromEitherK(FromEither)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromOption = FEi.fromOption(FromEither)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromOptionK = FEi.fromOptionK(FromEither)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromPredicate = FEi.fromPredicate(FromEither)
/**
* @since 0.9.2
* @category Combinator
*/
export const chainStateK = FS.chainStateK(FromState, Chain)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromStateK = FS.fromStateK(FromState)
/**
* @since 0.9.2
* @category Constructor
*/
export const get = FS.get(FromState)
/**
* @since 0.9.2
* @category Constructor
*/
export const gets = FS.gets(FromState)
/**
* @since 0.9.2
* @category Combinator
*/
export const modify = FS.modify(FromState)
/**
* @since 0.9.2
* @category Combinator
*/
export const put = FS.put(FromState)
/**
* @since 0.9.2
* @category Combinator
*/
export const useSome =
<R1>(provided: R1) =>
<S, R2, E, A>(
srte: StateReaderStreamEither<S, R1 & R2, E, A>,
): StateReaderStreamEither<S, R2, E, A> =>
(s) =>
(r) =>
srte(s)({ ...r, ...provided })
/**
* @since 0.9.2
* @category Combinator
*/
export const provideSome =
<R1>(provided: R1) =>
<S, R2, E, A>(
srte: StateReaderStreamEither<S, R1 & R2, E, A>,
): StateReaderStreamEither<S, R2, E, A> =>
(s) =>
(r) =>
srte(s)({ ...provided, ...r })
/**
* @since 0.9.2
* @category Combinator
*/
export const useAll =
<R>(provided: R) =>
<S, E, A>(srte: StateReaderStreamEither<S, R, E, A>): StateReaderStreamEither<S, unknown, E, A> =>
(s) =>
() =>
srte(s)(provided)
/**
* @since 0.9.2
* @category Combinator
*/
export const provideAll =
<R>(provided: R) =>
<S, E, A>(srte: StateReaderStreamEither<S, R, E, A>): StateReaderStreamEither<S, unknown, E, A> =>
(s) =>
(r) =>
srte(s)({ ...provided, ...(r as {}) })
/**
* @since 0.9.2
* @category Instance
*/
export const UseSome: UseSome4<URI> = {
useSome,
}
/**
* @since 0.9.2
* @category Instance
*/
export const UseAll: UseAll4<URI> = {
useAll,
}
/**
* @since 0.9.2
* @category Instance
*/
export const ProvideSome: ProvideSome4<URI> = {
provideSome,
}
/**
* @since 0.9.2
* @category Instance
*/
export const ProvideAll: ProvideAll4<URI> = {
provideAll,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Provide: Provide4<URI> = {
useSome,
useAll,
provideSome,
provideAll,
}