UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

1,219 lines (812 loc) 19 kB
--- title: Env.ts nav_order: 13 parent: Modules --- ## Env overview `Env` is the core of the higher-level modules like [Ref](./Ref.ts.md) and is a `ReaderT` of [Resume](./Resume.ts.md); but to be honest, being used so much, I didn't like writing `ReaderResume<E, A>` and chose to shorten to `Env<E, A>` for the "environmental" quality Reader provides. Combining Reader and Resume allows for creating APIs capable of utilizing dependency injection for their configuration and testability while still combining your sync/async workflows. While designing application APIs it is often better to describe the logic of your system separate from the implementation details. `Env` or rather `Reader` helps you accomplish this through the [Dependency Inversion Principle](https://alexnault.dev/dependency-inversion-principle-in-functional-typescript). This principle is one of the easiest ways to begin improving any codebase. Added in v0.9.2 --- <h2 class="text-delta">Table of contents</h2> - [Combinator](#combinator) - [FromResume](#fromresume) - [alt](#alt) - [altAll](#altall) - [altW](#altw) - [ap](#ap) - [apFirst](#apfirst) - [apFirstW](#apfirstw) - [apS](#aps) - [apSW](#apsw) - [apSecond](#apsecond) - [apSecondW](#apsecondw) - [apT](#apt) - [apTW](#aptw) - [apW](#apw) - [askAndProvide](#askandprovide) - [askAndUse](#askanduse) - [bind](#bind) - [bindTo](#bindto) - [bindW](#bindw) - [chain](#chain) - [chainFirst](#chainfirst) - [chainFirstIOK](#chainfirstiok) - [chainFirstResumeK](#chainfirstresumek) - [chainFirstTaskK](#chainfirsttaskk) - [chainFirstW](#chainfirstw) - [chainIOK](#chainiok) - [chainReaderK](#chainreaderk) - [chainRec](#chainrec) - [chainResumeK](#chainresumek) - [chainTaskK](#chaintaskk) - [chainW](#chainw) - [combineAll](#combineall) - [combineStruct](#combinestruct) - [constant](#constant) - [flap](#flap) - [flatten](#flatten) - [flattenW](#flattenw) - [map](#map) - [provideAll](#provideall) - [provideAllWith](#provideallwith) - [provideSome](#providesome) - [provideSomeWith](#providesomewith) - [race](#race) - [raceW](#racew) - [tap](#tap) - [toResume](#toresume) - [toResumeK](#toresumek) - [tupled](#tupled) - [useAll](#useall) - [useAllWith](#useallwith) - [useSome](#usesome) - [useSomeWith](#usesomewith) - [zip](#zip) - [zipW](#zipw) - [Constructor](#constructor) - [Do](#do) - [ask](#ask) - [asks](#asks) - [asksE](#askse) - [asksIOK](#asksiok) - [asksTaskK](#askstaskk) - [fromIO](#fromio) - [fromIOK](#fromiok) - [fromReader](#fromreader) - [fromReaderK](#fromreaderk) - [fromResume](#fromresume) - [fromResumeK](#fromresumek) - [fromTask](#fromtask) - [fromTaskK](#fromtaskk) - [of](#of) - [op](#op) - [Execution](#execution) - [execWith](#execwith) - [runWith](#runwith) - [Instance](#instance) - [Alt](#alt) - [Applicative](#applicative) - [Apply](#apply) - [Chain](#chain) - [ChainRec](#chainrec) - [FromIO](#fromio) - [FromReader](#fromreader) - [FromTask](#fromtask) - [Functor](#functor) - [Monad](#monad) - [MonadRec](#monadrec) - [Pointed](#pointed) - [Provide](#provide) - [ProvideAll](#provideall) - [ProvideSome](#providesome) - [UseAll](#useall) - [UseSome](#usesome) - [Model](#model) - [Env (interface)](#env-interface) - [Of (type alias)](#of-type-alias) - [Type-level](#type-level) - [RequirementsOf (type alias)](#requirementsof-type-alias) - [ValueOf (type alias)](#valueof-type-alias) - [Typeclass Constructor](#typeclass-constructor) - [getMonoid](#getmonoid) - [getSemigroup](#getsemigroup) - [URI](#uri) - [URI](#uri-1) - [URI (type alias)](#uri-type-alias) --- # Combinator ## FromResume **Signature** ```ts export declare const FromResume: FRe.FromResume2<'@typed/fp/Env'> ``` Added in v0.9.2 ## alt **Signature** ```ts export declare const alt: <E, A>(second: FN.Lazy<Env<E, A>>) => (first: Env<E, A>) => Env<E, A> ``` Added in v0.9.2 ## altAll **Signature** ```ts export declare const altAll: <E, A>(startWith: Env<E, A>) => (as: readonly Env<E, A>[]) => Env<E, A> ``` Added in v0.9.2 ## altW **Signature** ```ts export declare const altW: <E1, A>( snd: FN.Lazy<Env<E1, A>>, ) => <E2>(fst: Env<E2, A>) => Env<E1 & E2, A> ``` Added in v0.9.2 ## ap **Signature** ```ts export declare const ap: <R, A>(fa: Env<R, A>) => <B>(fab: Env<R, Arity1<A, B>>) => Env<R, B> ``` Added in v0.9.2 ## apFirst **Signature** ```ts export declare const apFirst: <E, B>(second: Env<E, B>) => <A>(first: Env<E, A>) => Env<E, A> ``` Added in v0.9.2 ## apFirstW **Signature** ```ts export declare const apFirstW: <E1, B>( second: Env<E1, B>, ) => <E2, A>(first: Env<E2, A>) => Env<E1 & E2, A> ``` Added in v0.9.2 ## apS **Signature** ```ts export declare const apS: <N, A, E, B>( name: Exclude<N, keyof A>, fb: Env<E, B>, ) => (fa: Env<E, A>) => Env<E, { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }> ``` Added in v0.9.2 ## apSW **Signature** ```ts export declare const apSW: <N extends string, A, E1, B>( name: Exclude<N, keyof A>, fb: Env<E1, B>, ) => <E2>( fa: Env<E2, A>, ) => Env<E1 & E2, { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }> ``` Added in v0.9.2 ## apSecond **Signature** ```ts export declare const apSecond: <E, B>(second: Env<E, B>) => <A>(first: Env<E, A>) => Env<E, B> ``` Added in v0.9.2 ## apSecondW **Signature** ```ts export declare const apSecondW: <E1, B>( second: Env<E1, B>, ) => <E2, A>(first: Env<E2, A>) => Env<E1 & E2, B> ``` Added in v0.9.2 ## apT **Signature** ```ts export declare const apT: <E, B>(fb: Env<E, B>) => <A>(fas: Env<E, A>) => Env<E, readonly [...A, B]> ``` Added in v0.9.2 ## apTW **Signature** ```ts export declare const apTW: <E1, B>( fb: Env<E1, B>, ) => <E2, A extends readonly unknown[]>(fas: Env<E2, A>) => Env<E1 & E2, readonly [...A, B]> ``` Added in v0.9.2 ## apW **Signature** ```ts export declare const apW: <R1, A>( fa: Env<R1, A>, ) => <R2, B>(fab: Env<R2, Arity1<A, B>>) => Env<R1 & R2, B> ``` Added in v0.9.2 ## askAndProvide **Signature** ```ts export declare const askAndProvide: <E, B>(hkt: Env<E, B>) => Env<E, Env<unknown, B>> ``` Added in v0.9.2 ## askAndUse **Signature** ```ts export declare const askAndUse: <E, B>(hkt: Env<E, B>) => Env<E, Env<unknown, B>> ``` Added in v0.9.2 ## bind **Signature** ```ts export declare const bind: <N, A, E, B>( name: Exclude<N, keyof A>, f: (a: A) => Env<E, B>, ) => (ma: Env<E, A>) => Env<E, { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }> ``` Added in v0.9.2 ## bindTo **Signature** ```ts export declare const bindTo: <N>( name: N, ) => <E, A>(fa: Env<E, A>) => Env<E, { readonly [K in N]: A }> ``` Added in v0.9.2 ## bindW **Signature** ```ts export declare const bindW: <N extends string, A, E1, B>( name: Exclude<N, keyof A>, f: (a: A) => Env<E1, B>, ) => <E2>( ma: Env<E2, A>, ) => Env<E1 & E2, { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }> ``` Added in v0.9.2 ## chain **Signature** ```ts export declare const chain: <A, R, B>( f: (a: A) => Re.Reader<R, R.Resume<B>>, ) => (ma: Re.Reader<R, R.Resume<A>>) => Re.Reader<R, R.Resume<B>> ``` Added in v0.9.2 ## chainFirst **Signature** ```ts export declare const chainFirst: <A, E, B>( f: (a: A) => Env<E, B>, ) => (first: Env<E, A>) => Env<E, A> ``` Added in v0.9.2 ## chainFirstIOK **Signature** ```ts export declare const chainFirstIOK: <A, B>( f: (a: A) => IO.IO<B>, ) => <E>(first: Env<E, A>) => Env<E, A> ``` Added in v0.9.2 ## chainFirstResumeK **Signature** ```ts export declare const chainFirstResumeK: <A, B>( f: (value: A) => R.Resume<B>, ) => <E>(hkt: Env<E, A>) => Env<E, A> ``` Added in v0.9.2 ## chainFirstTaskK **Signature** ```ts export declare const chainFirstTaskK: <A, B>( f: (a: A) => Task.Task<B>, ) => <E>(first: Env<E, A>) => Env<E, A> ``` Added in v0.9.2 ## chainFirstW **Signature** ```ts export declare const chainFirstW: <A, E1, B>( f: (a: A) => Env<E1, B>, ) => <E2>(first: Env<E2, A>) => Env<E1 & E2, A> ``` Added in v0.9.2 ## chainIOK **Signature** ```ts export declare const chainIOK: <A, B>(f: (a: A) => IO.IO<B>) => <E>(first: Env<E, A>) => Env<E, B> ``` Added in v0.9.2 ## chainReaderK **Signature** ```ts export declare const chainReaderK: <A, R, B>( f: (a: A) => Re.Reader<R, B>, ) => (ma: Env<R, A>) => Env<R, B> ``` Added in v0.9.2 ## chainRec **Signature** ```ts export declare function chainRec<F extends (value: any) => Env<any, E.Either<any, any>>>( f: F, ): ( value: ArgsOf<F>[0], ) => Env< RequirementsOf<ReturnType<F>>, [ValueOf<ReturnType<F>>] extends [E.Either<any, infer R>] ? R : never > ``` Added in v0.9.2 ## chainResumeK **Signature** ```ts export declare const chainResumeK: <A, B>( f: (value: A) => R.Resume<B>, ) => <E>(hkt: Env<E, A>) => Env<E, B> ``` Added in v0.9.2 ## chainTaskK **Signature** ```ts export declare const chainTaskK: <A, B>( f: (a: A) => Task.Task<B>, ) => <E>(first: Env<E, A>) => Env<E, B> ``` Added in v0.9.2 ## chainW **Signature** ```ts export declare const chainW: <A, R1, B>( f: (a: A) => Env<R1, B>, ) => <R2>(ma: Env<R2, A>) => Env<R1 & R2, B> ``` Added in v0.9.2 ## combineAll **Signature** ```ts export declare const combineAll: <A extends readonly Env<any, any>[]>( ...envs: A ) => Env< Intersect<{ [K in keyof A]: RequirementsOf<A[K]> }, unknown>, { [K in keyof A]: ValueOf<A[K]> } > ``` Added in v0.9.2 ## combineStruct **Signature** ```ts export declare const combineStruct: <Props extends Readonly<Record<string, Env<any, any>>>>( props: Props, ) => Env<unknown, { readonly [K in keyof Props]: ValueOf<Props[K]> }> ``` Added in v0.11.0 ## constant **Signature** ```ts export declare const constant: <A>(a: A) => <R>(fa: Env<R, unknown>) => Env<R, A> ``` Added in v0.9.2 ## flap **Signature** ```ts export declare const flap: <A>(a: A) => <E, B>(fab: Env<E, (a: A) => B>) => Env<E, B> ``` Added in v0.9.2 ## flatten **Signature** ```ts export declare const flatten: <E, A>(env: Env<E, Env<E, A>>) => Env<E, A> ``` Added in v0.9.2 ## flattenW **Signature** ```ts export declare const flattenW: <E1, E2, A>(env: Env<E1, Env<E2, A>>) => Env<E1 & E2, A> ``` Added in v0.9.2 ## map **Signature** ```ts export declare const map: <A, B>(f: (a: A) => B) => <R>(fa: Env<R, A>) => Env<R, B> ``` Added in v0.9.2 ## provideAll **Signature** ```ts export declare const provideAll: <E1>(provided: E1) => <A>(env: Env<E1, A>) => Env<unknown, A> ``` Added in v0.9.2 ## provideAllWith **Signature** ```ts export declare const provideAllWith: <R, A>(provider: Env<R, A>) => <B>(hkt: Env<A, B>) => Env<R, B> ``` Added in v0.9.2 ## provideSome **Signature** ```ts export declare const provideSome: <E1>(provided: E1) => <E2, A>(env: Env<E1 & E2, A>) => Env<E2, A> ``` Added in v0.9.2 ## provideSomeWith **Signature** ```ts export declare const provideSomeWith: <E1, A>( provider: Env<E1, A>, ) => P.Provider2<'@typed/fp/Env', A, E1> ``` Added in v0.9.2 ## race **Signature** ```ts export declare const race: <E, A>(a: Env<E, A>) => <B>(b: Env<E, B>) => Env<E, A | B> ``` Added in v0.9.2 ## raceW **Signature** ```ts export declare const raceW: <E1, A>(a: Env<E1, A>) => <E2, B>(b: Env<E2, B>) => Env<E1 & E2, A | B> ``` Added in v0.9.2 ## tap **Signature** ```ts export declare const tap: <A>(f: (a: A) => any) => <R>(fa: Env<R, A>) => Env<R, A> ``` Added in v0.9.2 ## toResume **Signature** ```ts export declare const toResume: <E, B>(hkt: Env<E, B>) => Env<E, R.Resume<B>> ``` Added in v0.9.2 ## toResumeK **Signature** ```ts export declare const toResumeK: <Args extends readonly any[], E, A>( envK: (...args: Args) => Env<E, A>, ) => Env<E, (...args: Args) => R.Resume<A>> ``` Added in v0.9.2 ## tupled **Signature** ```ts export declare const tupled: <E, A>(fa: Env<E, A>) => Env<E, readonly [A]> ``` Added in v0.9.2 ## useAll **Signature** ```ts export declare const useAll: <E1>(provided: E1) => <A>(env: Env<E1, A>) => Env<unknown, A> ``` Added in v0.9.2 ## useAllWith **Signature** ```ts export declare const useAllWith: <R, A>(provider: Env<R, A>) => <B>(hkt: Env<A, B>) => Env<R, B> ``` Added in v0.9.2 ## useSome **Signature** ```ts export declare const useSome: <E1>(provided: E1) => <E2, A>(env: Env<E1 & E2, A>) => Env<E2, A> ``` Added in v0.9.2 ## useSomeWith **Signature** ```ts export declare const useSomeWith: <E1, A>( provider: Env<E1, A>, ) => P.Provider2<'@typed/fp/Env', A, E1> ``` Added in v0.9.2 ## zip **Signature** ```ts export declare const zip: <E, A>(ta: readonly Env<E, A>[]) => Env<E, readonly A[]> ``` Added in v0.9.2 ## zipW **Signature** ```ts export declare const zipW: <A extends readonly Env<any, any>[]>( envs: A, ) => Env< Intersect<{ [K in keyof A]: RequirementsOf<A[K]> }, unknown>, { [K in keyof A]: ValueOf<A[K]> } > ``` Added in v0.9.2 # Constructor ## Do **Signature** ```ts export declare const Do: Env<unknown, {}> ``` Added in v0.9.2 ## ask **Signature** ```ts export declare const ask: <R>() => Env<R, R> ``` Added in v0.9.2 ## asks **Signature** ```ts export declare const asks: <R, A>(f: (r: R) => A) => Env<R, A> ``` Added in v0.9.2 ## asksE **Signature** ```ts export declare const asksE: <R, E, A>(f: (r: R) => Env<E, A>) => Env<E & R, A> ``` Added in v0.9.2 ## asksIOK **Signature** ```ts export declare const asksIOK: <R, A>(f: (r: R) => IO.IO<A>) => Env<R, A> ``` Added in v0.9.2 ## asksTaskK **Signature** ```ts export declare const asksTaskK: <R, A>(f: (r: R) => Task.Task<A>) => Env<R, A> ``` Added in v0.9.2 ## fromIO **Signature** ```ts export declare const fromIO: <A>(fa: IO.IO<A>) => Env<unknown, A> ``` Added in v0.9.2 ## fromIOK **Signature** ```ts export declare const fromIOK: <A, B>(f: (...a: A) => IO.IO<B>) => <E>(...a: A) => Env<E, B> ``` Added in v0.9.2 ## fromReader **Signature** ```ts export declare const fromReader: <R, A>(ma: Re.Reader<R, A>) => Env<R, A> ``` Added in v0.9.2 ## fromReaderK **Signature** ```ts export declare const fromReaderK: <A, R, B>( f: (...a: A) => Re.Reader<R, B>, ) => (...a: A) => Env<R, B> ``` Added in v0.9.2 ## fromResume **Signature** ```ts export declare const fromResume: <A, E = unknown>(resume: R.Resume<A>) => Env<E, A> ``` Added in v0.9.2 ## fromResumeK **Signature** ```ts export declare const fromResumeK: <A, B>( f: (...args: A) => R.Resume<B>, ) => <E>(...args: A) => Env<E, B> ``` Added in v0.9.2 ## fromTask **Signature** ```ts export declare const fromTask: <A, E = unknown>(fa: Task.Task<A>) => Env<E, A> ``` Added in v0.9.2 ## fromTaskK **Signature** ```ts export declare const fromTaskK: <A, B>(f: (...a: A) => Task.Task<B>) => <E>(...a: A) => Env<E, B> ``` Added in v0.9.2 ## of **Signature** ```ts export declare const of: <A>(a: A) => Of<A> ``` Added in v0.9.2 ## op Construct an Env to a lazily-defined Env-based effect that must be provided later. Does not support functions which require type-parameters as they will resolve to unknown, due to limitations in TS, if you need this maybe use [asksE](#askse) **Signature** ```ts export declare const op: <F extends (...args: readonly any[]) => Env<any, any>>() => < K extends string | number | symbol, >( key: K, ) => { (...args: ArgsOf<F>): Env<{ readonly [_ in K]: F }, ValueOf<ReturnType<F>>> readonly key: K } ``` Added in v0.9.2 # Execution ## execWith **Signature** ```ts export declare const execWith: <E>(requirements: E) => (env: Env<E, any>) => Disposable ``` Added in v0.9.2 ## runWith **Signature** ```ts export declare const runWith: <A>( f: (value: A) => Disposable, ) => <E>(requirements: E) => (env: Env<E, A>) => Disposable ``` Added in v0.9.2 # Instance ## Alt **Signature** ```ts export declare const Alt: Alt_.Alt2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Applicative **Signature** ```ts export declare const Applicative: FpApplicative.Applicative2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Apply **Signature** ```ts export declare const Apply: Ap.Apply2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Chain **Signature** ```ts export declare const Chain: FpChain.Chain2<'@typed/fp/Env'> ``` Added in v0.9.2 ## ChainRec **Signature** ```ts export declare const ChainRec: ChainRec2<'@typed/fp/Env'> ``` Added in v0.9.2 ## FromIO **Signature** ```ts export declare const FromIO: FIO.FromIO2<'@typed/fp/Env'> ``` Added in v0.9.2 ## FromReader **Signature** ```ts export declare const FromReader: FR.FromReader2<'@typed/fp/Env'> ``` Added in v0.9.2 ## FromTask **Signature** ```ts export declare const FromTask: FT.FromTask2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Functor **Signature** ```ts export declare const Functor: Functor2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Monad **Signature** ```ts export declare const Monad: Monad2<'@typed/fp/Env'> ``` Added in v0.9.2 ## MonadRec **Signature** ```ts export declare const MonadRec: MonadRec2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Pointed **Signature** ```ts export declare const Pointed: Pointed2<'@typed/fp/Env'> ``` Added in v0.9.2 ## Provide **Signature** ```ts export declare const Provide: P.Provide2<'@typed/fp/Env'> ``` Added in v0.9.2 ## ProvideAll **Signature** ```ts export declare const ProvideAll: P.ProvideAll2<'@typed/fp/Env'> ``` Added in v0.9.2 ## ProvideSome **Signature** ```ts export declare const ProvideSome: P.ProvideSome2<'@typed/fp/Env'> ``` Added in v0.9.2 ## UseAll **Signature** ```ts export declare const UseAll: P.UseAll2<'@typed/fp/Env'> ``` Added in v0.9.2 ## UseSome **Signature** ```ts export declare const UseSome: P.UseSome2<'@typed/fp/Env'> ``` Added in v0.9.2 # Model ## Env (interface) Env is specialization of Reader<R, Resume<A>> **Signature** ```ts export interface Env<R, A> extends Re.Reader<R, R.Resume<A>> {} ``` Added in v0.9.2 ## Of (type alias) **Signature** ```ts export type Of<A> = Env<unknown, A> ``` Added in v0.9.2 # Type-level ## RequirementsOf (type alias) **Signature** ```ts export type RequirementsOf<A> = [A] extends [Env<infer R, any>] ? R : [A] extends [FN.FunctionN<any, Env<infer R, any>>] ? R : never ``` Added in v0.9.2 ## ValueOf (type alias) **Signature** ```ts export type ValueOf<A> = A extends Env<any, infer R> ? R : A extends FN.FunctionN<any, Env<any, infer R>> ? R : never ``` Added in v0.9.2 # Typeclass Constructor ## getMonoid **Signature** ```ts export declare const getMonoid: <A, E>(M: Monoid<A>) => Monoid<Env<E, A>> ``` Added in v0.9.2 ## getSemigroup **Signature** ```ts export declare const getSemigroup: <A, E>(S: Semigroup<A>) => Semigroup<Env<E, A>> ``` Added in v0.9.2 # URI ## URI **Signature** ```ts export declare const URI: '@typed/fp/Env' ``` Added in v0.9.2 ## URI (type alias) **Signature** ```ts export type URI = typeof URI ``` Added in v0.9.2