/** * FromEnv is a Typeclass which represents the Natural Transformation from an Env into another * effect. * * @since 0.9.2 */ import { Chain, Chain2, Chain3, Chain4, chainFirst } from 'fp-ts/Chain' import { flow } from 'fp-ts/function' import { HKT, HKT2, Kind2, Kind3, Kind4, URIS2, URIS3, URIS4 } from 'fp-ts/HKT' import { NaturalTransformation22, NaturalTransformation23R, NaturalTransformation23RC, NaturalTransformation24R, } from 'fp-ts/NaturalTransformation' import * as E from './Env' import { ApplyVariance, Hkt, Initial } from './HKT' import * as Provide from './Provide' /** * @since 0.9.2 * @category Typeclass */ export type FromEnv = { readonly URI?: F readonly fromEnv: (env: E.Env) => HKT2 } /** * @since 0.9.2 * @category Combinator */ export type FromEnv2 = { readonly URI?: F readonly fromEnv: NaturalTransformation22 } /** * @since 0.9.2 * @category Typeclass */ export type FromEnv3 = { readonly URI?: F readonly fromEnv: NaturalTransformation23R } /** * @since 0.9.2 * @category Typeclass */ export type FromEnv3C = { readonly URI?: F readonly fromEnv: NaturalTransformation23RC } /** * @since 0.9.2 * @category Typeclass */ export type FromEnv4 = { readonly URI?: F readonly fromEnv: NaturalTransformation24R } /** * @since 0.9.2 * @category Constructor */ export function fromEnvK( F: FromEnv2, ): ( f: (...args: A) => E.Env, ) => (...args: A) => Hkt export function fromEnvK( F: FromEnv3, ): ( f: (...args: A) => E.Env, ) => (...args: A) => Hkt export function fromEnvK( F: FromEnv4, ): ( f: (...args: A) => E.Env, ) => (...args: A) => Hkt export function fromEnvK( F: FromEnv, ): ( f: (...args: A) => E.Env, ) => (...args: A) => Hkt export function fromEnvK(F: FromEnv) { return (f: (...args: A) => E.Env) => (...args: A) => F.fromEnv(f(...args)) } /** * @since 0.9.2 * @category Combinator */ export function chainEnvK( F: FromEnv2, C: Chain2, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, B]> export function chainEnvK( F: FromEnv3, C: Chain3, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, E, B]> export function chainEnvK( F: FromEnv4, C: Chain4, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, E, B]> export function chainEnvK( F: FromEnv, C: Chain, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, B]> export function chainEnvK( F: FromEnv, C: Chain, ): (f: (value: A) => E.Env) => (hkt: HKT) => HKT { return (f) => C.chain(flow(f, F.fromEnv) as any) } /** * @since 0.9.2 * @category Combinator */ export function chainFirstEnvK( F: FromEnv2, C: Chain2, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, A]> export function chainFirstEnvK( F: FromEnv3, C: Chain3, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, E, A]> export function chainFirstEnvK( F: FromEnv4, C: Chain4, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, E, A]> export function chainFirstEnvK( F: FromEnv, C: Chain, ): ( f: (value: A) => E.Env, ) => (hkt: Hkt) => Hkt, A]> export function chainFirstEnvK( F: FromEnv, C: Chain, ): (f: (value: A) => E.Env) => (hkt: HKT) => HKT { const chainF = chainFirst(C) return (f) => chainF(flow(f, F.fromEnv) as any) } /** * @since 0.9.2 * @category Combinator */ export function provideSomeWithEnv( F: FromEnv4 & Provide.ProvideSome4 & Chain4, ): (env: E.Env) => Provide.Provider4, Initial> export function provideSomeWithEnv( F: FromEnv3 & Provide.ProvideSome3 & Chain3, ): (env: E.Env) => Provide.Provider3> export function provideSomeWithEnv( F: FromEnv2 & Provide.ProvideSome2 & Chain2, ): (env: E.Env) => Provide.Provider2 export function provideSomeWithEnv( F: FromEnv & Provide.ProvideSome & Chain, ): (env: E.Env) => Provide.Provider export function provideSomeWithEnv(F: FromEnv & Provide.ProvideSome & Chain) { return flow(F.fromEnv, Provide.provideSomeWith(F)) } /** * @since 0.9.2 * @category Combinator */ export function provideAllWithEnv( F: FromEnv4 & Provide.ProvideAll4 & Chain4, ): (env: E.Env) => (hkt: Kind4) => Kind4 export function provideAllWithEnv( F: FromEnv3 & Provide.ProvideAll3 & Chain3, ): (env: E.Env) => (hkt: Kind3) => Kind3 export function provideAllWithEnv( F: FromEnv2 & Provide.ProvideAll2 & Chain2, ): (env: E.Env) => (hkt: Kind2) => Kind2 export function provideAllWithEnv( F: FromEnv & Provide.ProvideAll & Chain, ): (env: E.Env) => (hkt: HKT2) => HKT2 export function provideAllWithEnv(F: FromEnv & Provide.ProvideAll & Chain) { return flow(F.fromEnv, Provide.provideAllWith(F)) } /** * @since 0.9.2 * @category Combinator */ export function useSomeWithEnv( F: FromEnv4 & Provide.UseSome4 & Chain4, ): (env: E.Env) => Provide.Provider4, Initial> export function useSomeWithEnv( F: FromEnv3 & Provide.UseSome3 & Chain3, ): (env: E.Env) => Provide.Provider3> export function useSomeWithEnv( F: FromEnv2 & Provide.UseSome2 & Chain2, ): (env: E.Env) => Provide.Provider2 export function useSomeWithEnv( F: FromEnv & Provide.UseSome & Chain, ): (env: E.Env) => Provide.Provider export function useSomeWithEnv(F: FromEnv & Provide.UseSome & Chain) { return flow(F.fromEnv, Provide.useSomeWith(F)) } /** * @since 0.9.2 * @category Combinator */ export function useAllWithEnv( F: FromEnv4 & Provide.UseAll4 & Chain4, ): (env: E.Env) => (hkt: Kind4) => Kind4 export function useAllWithEnv( F: FromEnv3 & Provide.UseAll3 & Chain3, ): (env: E.Env) => (hkt: Kind3) => Kind3 export function useAllWithEnv( F: FromEnv2 & Provide.UseAll2 & Chain2, ): (env: E.Env) => (hkt: Kind2) => Kind2 export function useAllWithEnv( F: FromEnv & Provide.UseAll & Chain, ): (env: E.Env) => (hkt: HKT2) => HKT2 export function useAllWithEnv(F: FromEnv & Provide.UseAll & Chain) { return flow(F.fromEnv, Provide.useAllWith(F)) }