/** * @typed/fp/FxEnv is a generator-based do-notation for Env. * * @since 0.13.0 */ import { Applicative2 } from 'fp-ts/Applicative' import * as Ap from 'fp-ts/Apply' import * as Ch from 'fp-ts/Chain' import { ChainRec2 } from 'fp-ts/ChainRec' import { FromReader2 } from 'fp-ts/FromReader' import * as F from 'fp-ts/Functor' import * as IO from 'fp-ts/IO' import { Monad2 } from 'fp-ts/Monad' import { Pointed2 } from 'fp-ts/Pointed' import * as R from 'fp-ts/Reader' import * as T from 'fp-ts/Task' import * as E from './Env' import { flow } from './function' import { Fx } from './Fx' import * as FxT from './FxT' import * as P from './Provide' import * as Re from './Resume' /** * @category Constructor * @since 0.13.0 */ export const of = FxT.of(E.Pointed) /** * @category Combinator * @since 0.13.0 */ export const ap = FxT.ap({ ...E.MonadRec, ...E.Apply }) /** * @category Combinator * @since 0.13.0 */ export const chain = FxT.chain() /** * @category Combinator * @since 0.13.0 */ export const chainRec = FxT.chainRec(E.MonadRec) /** * @category Combinator * @since 0.13.0 */ export const doEnv = FxT.getDo() /** * @category Combinator * @since 0.13.0 */ export const liftEnv = FxT.liftFx() /** * @category Combinator * @since 0.13.0 */ export const map = FxT.map() /** * @category Interpreter * @since 0.13.0 */ export const toEnv = FxT.toMonad(E.MonadRec) as , R>( fx: Fx, ) => [Y] extends [E.Env] ? E.Env : never /** * @category Interpreter * @since 0.13.0 */ export const Do = flow(doEnv, toEnv) /** * @category Combinator * @since 0.13.0 */ export const useSome = FxT.useSome({ ...E.UseSome, ...E.MonadRec }) /** * @category Combinator * @since 0.13.0 */ export const useAll = FxT.useAll({ ...E.UseAll, ...E.MonadRec }) /** * @category Combinator * @since 0.13.0 */ export const provideSome = FxT.provideSome({ ...E.ProvideSome, ...E.MonadRec }) /** * @category Combinator * @since 0.13.0 */ export const provideAll = FxT.provideAll({ ...E.ProvideAll, ...E.MonadRec }) /** * @category Constructor * @since 0.13.0 */ export const fromIO = FxT.fromNaturalTransformation(E.fromIO) /** * @category Constructor * @since 0.13.0 */ export const fromResume = FxT.fromNaturalTransformation(E.fromResume) /** * @category Constructor * @since 0.13.0 */ export const fromTask = FxT.fromNaturalTransformation(E.fromTask) /** * @category ConstructorfromReader * @since 0.13.0 */ export const asks = FxT.fromNaturalTransformation(E.fromReader) /** * @category Constructor * @since 0.13.0 */ export const ask = FxT.ask(E.FromReader) /** * @category URI * @since 0.13.0 */ export const URI = '@typed/fp/Fx/Env' /** * @category URI * @since 0.13.0 */ export type URI = typeof URI /** * @category Model * @since 0.13.0 */ export interface FxEnv extends Fx, A> {} /** * @category Type-level * @since 0.13.0 */ export type GetRequirements = A extends FxEnv ? E : never /** * @category Type-level * @since 0.13.0 */ export type GetValue = A extends FxEnv ? R : never declare module 'fp-ts/HKT' { export interface URItoKind2 { [URI]: FxEnv } } /** * @category Instance * @since 0.13.0 */ export const Pointed: Pointed2 = { of, } /** * @category Instance * @since 0.13.0 */ export const Functor: F.Functor2 = { map, } /** * @category Instance * @since 0.13.0 */ export const Apply: Ap.Apply2 = { ...Functor, ap, } /** * @category Combinator * @since 0.13.0 */ export const apFirst = Ap.apFirst(Apply) /** * @category Combinator * @since 0.13.0 */ export const apFirstW = apFirst as ( second: FxEnv, ) => (first: FxEnv) => FxEnv /** * @category Combinator * @since 0.13.0 */ export const apS = Ap.apS(Apply) /** * @category Combinator * @since 0.13.0 */ export const apSW = apS as ( name: Exclude, fb: FxEnv, ) => ( fa: FxEnv, ) => FxEnv /** * @category Combinator * @since 0.13.0 */ export const apSecond = Ap.apSecond(Apply) /** * @category Combinator * @since 0.13.0 */ export const apSecondW = apSecond as ( second: FxEnv, ) => (first: FxEnv) => FxEnv /** * @category Combinator * @since 0.13.0 */ export const apT = Ap.apT(Apply) /** * @category Combinator * @since 0.13.0 */ export const apTW = apT as ( fb: FxEnv, ) => (fas: FxEnv) => FxEnv /** * @category Combinator * @since 0.13.0 */ export const getApplySemigroup = Ap.getApplySemigroup(Apply) /** * @category Instance * @since 0.13.0 */ export const Applicative: Applicative2 = { ...Apply, ...Pointed, } /** * @category Instance * @since 0.13.0 */ export const Chain: Ch.Chain2 = { ...Functor, chain, } /** * @category Combinator * @since 0.13.0 */ export const bind = Ch.bind(Chain) /** * @category Combinator * @since 0.13.0 */ export const chainFirst = Ch.chainFirst(Chain) /** * @category Instance * @since 0.13.0 */ export const Monad: Monad2 = { ...Chain, ...Pointed, } /** * @category Instance * @since 0.13.0 */ export const ChainRec: ChainRec2 = { chainRec, } /** * @category Instance * @since 0.13.0 */ export const UseSome: P.UseSome2 = { useSome, } /** * @category Instance * @since 0.13.0 */ export const UseAll: P.UseAll2 = { useAll, } /** * @category Instance * @since 0.13.0 */ export const ProvideSome: P.ProvideSome2 = { provideSome, } /** * @category Instance * @since 0.13.0 */ export const ProvideAll: P.ProvideAll2 = { provideAll, } /** * @category Instance * @since 0.13.0 */ export const Provide: P.Provide2 = { useSome, useAll, provideSome, provideAll, } /** * @since 0.13.0 * @category Constructor */ export const fromReader = flow(E.fromReader, liftEnv) /** * @category Instance * @since 0.13.0 */ export const FromReader: FromReader2 = { fromReader, } /** * @since 0.13.0 * @category Combinator */ export const provideAllWith = P.provideAllWith({ ...ProvideAll, ...Chain }) /** * @since 0.13.0 * @category Combinator */ export const useAllWith = P.useAllWith({ ...UseAll, ...Chain }) /** * @since 0.13.0 * @category Combinator */ export const provideSomeWith = P.provideSomeWith({ ...ProvideSome, ...Chain }) /** * @since 0.13.0 * @category Combinator */ export const useSomeWith = P.useSomeWith({ ...UseSome, ...Chain }) /** * @since 0.13.0 * @category Combinator */ export const askAndUse = P.askAndUse({ ...UseAll, ...Chain, ...FromReader }) /** * @since 0.13.0 * @category Combinator */ export const askAndProvide = P.askAndProvide({ ...ProvideAll, ...Chain, ...FromReader })