/** * EnvOption is an OptionT of [Env](./Env.ts.md) * * @since 0.9.2 */ import { Alt2 } from 'fp-ts/Alt' import { Alternative2 } from 'fp-ts/Alternative' import { Applicative2 } from 'fp-ts/Applicative' import * as Ap from 'fp-ts/Apply' import { Chain2 } from 'fp-ts/Chain' import { ChainRec2 } from 'fp-ts/ChainRec' import * as Ei from 'fp-ts/Either' import { FromIO2 } from 'fp-ts/FromIO' import * as FR from 'fp-ts/FromReader' import { FromReader2 } from 'fp-ts/FromReader' import { FromTask2 } from 'fp-ts/FromTask' import { flow, Lazy, pipe } from 'fp-ts/function' import { Functor2 } from 'fp-ts/Functor' import { Monad2 } from 'fp-ts/Monad' import * as O from 'fp-ts/Option' import * as OT from 'fp-ts/OptionT' import { Pointed2 } from 'fp-ts/Pointed' import * as E from './Env' import * as FE from './FromEnv' import { FromEnv2 } from './FromEnv' import * as FRe from './FromResume' import { FromResume2 } from './FromResume' import { MonadRec2 } from './MonadRec' import { Provide2, ProvideAll2, ProvideSome2, UseAll2, UseSome2 } from './Provide' import { Resume } from './Resume' /** * @since 0.9.2 * @category Model */ export interface EnvOption extends E.Env> {} /** * @since 0.9.2 * @category Combinator */ export const alt = OT.alt(E.Monad) /** * @since 0.9.2 * @category Combinator */ export const ap = OT.ap(E.Apply) /** * @since 0.11.0 * @category Combinator */ export const apW = ap as ( fa: E.Env>, ) => (fab: E.Env B>>) => E.Env> /** * @since 0.9.2 * @category Combinator */ export const chain = OT.chain(E.Monad) /** * @since 0.9.2 * @category Combinator */ export const chainNullableK = OT.chainNullableK(E.Monad) /** * @since 0.9.2 * @category Combinator */ export const chainOptionK = OT.chainOptionK(E.Monad) /** * @since 0.9.2 * @category Constructor */ export const fromEither = OT.fromEither(E.Monad) /** * @since 0.9.2 * @category Constructor */ export const fromEnv = OT.fromF(E.Monad) /** * @since 0.9.2 * @category Constructor */ export const fromNullable = OT.fromNullable(E.Pointed) /** * @since 0.9.2 * @category Constructor */ export const fromNullableK = OT.fromNullableK(E.Pointed) /** * @since 0.9.2 * @category Constructor */ export const fromOptionK = OT.fromOptionK(E.Pointed) /** * @since 0.9.2 * @category Constructor */ export const fromPredicate = OT.fromPredicate(E.Pointed) /** * @since 0.9.2 * @category Deconstuctor */ export const getOrElse = OT.getOrElse(E.Functor) /** * @since 0.9.2 * @category Deconstructor */ export const getOrElseE = OT.getOrElseE(E.Monad) /** * @since 0.9.2 * @category Combinator */ export const map = OT.map(E.Functor) /** * @since 0.9.2 * @category Deconstructor */ export const match = OT.match(E.Functor) /** * @since 0.12.1 * @category Deconstructor */ export const matchW = match as ( onNone: () => A, onSome: (b: B) => C, ) => (ma: E.Env>) => E.Env /** * @since 0.9.2 * @category Deconstructor */ export const matchE = OT.matchE(E.Chain) /** * @since 0.12.1 * @category Deconstructor */ export const matchEW = matchE as ( onNone: () => E.Env, onSome: (a: B) => E.Env, ) => (ma: E.Env>) => E.Env /** * @since 0.9.2 * @category Constructor */ export const some = OT.some(E.Pointed) /** * @since 0.9.2 * @category Constructor */ export const zero = OT.zero(E.Pointed) /** * @since 0.9.2 * @category Combinator */ export const getOrElseEW = getOrElseE as ( onNone: Lazy>, ) => (fa: E.Env>) => E.Env /** * @since 0.9.2 * @category URI */ export const URI = '@typed/fp/EnvOption' /** * @since 0.9.2 * @category URI */ export type URI = typeof URI declare module 'fp-ts/HKT' { export interface URItoKind2 { [URI]: EnvOption } } declare module './HKT' { export interface URItoVariance { [URI]: V } } /** * @since 0.9.2 * @category Instance */ export const Pointed: Pointed2 = { of: flow(O.some, E.of), } /** * @since 0.9.2 * @category Instance */ export const Functor: Functor2 = { map, } /** * @since 0.9.2 * @category Instance */ export const Apply: Ap.Apply2 = { ...Functor, ap, } /** * @since 0.11.0 * @category Combinator */ export const apFirst = Ap.apFirst(Apply) /** * @since 0.11.0 * @category Combinator */ export const apFirstW = apFirst as ( second: EnvOption, ) => (first: EnvOption) => EnvOption /** * @since 0.11.0 * @category Combinator */ export const apS = Ap.apS(Apply) /** * @since 0.11.0 * @category Combinator */ export const apSW = apS as ( name: Exclude, fb: EnvOption, ) => ( fa: EnvOption, ) => EnvOption /** * @since 0.11.0 * @category Combinator */ export const apSecond = Ap.apSecond(Apply) /** * @since 0.11.0 * @category Combinator */ export const apSecondW = apSecond as ( second: EnvOption, ) => (first: EnvOption) => EnvOption /** * @since 0.11.0 * @category Combinator */ export const apT = Ap.apT(Apply) /** * @since 0.11.0 * @category Combinator */ export const apTW = apT as ( fb: EnvOption, ) => ( fas: EnvOption, ) => EnvOption /** * @since 0.11.0 * @category Combinator */ export const getApplySemigroup = Ap.getApplySemigroup(Apply) /** * @since 0.9.2 * @category Instance */ export const Applicative: Applicative2 = { ...Apply, ...Pointed, } /** * @since 0.9.2 * @category Instance */ export const Chain: Chain2 = { ...Functor, chain, } /** * @since 0.9.2 * @category Combinator */ export const chainRec = (f: (value: A) => EnvOption>) => (value: A): EnvOption => pipe( value, E.chainRec((a) => pipe( a, f, E.map((oe) => { if (O.isNone(oe)) { return Ei.right(oe) } return pipe(oe.value, Ei.map(O.some)) }), ), ), ) /** * @since 0.9.2 * @category Instance */ export const ChainRec: ChainRec2 = { chainRec, } /** * @since 0.9.2 * @category Instance */ export const Monad: Monad2 = { ...Chain, ...Pointed, } /** * @since 0.9.2 * @category Instance */ export const MonadRec: MonadRec2 = { ...Monad, chainRec, } /** * @since 0.9.2 * @category Instance */ export const Alt: Alt2 = { ...Functor, alt, } /** * @since 0.9.2 * @category Instance */ export const Alternative: Alternative2 = { ...Alt, zero, } /** * @since 0.9.2 * @category Instance */ export const FromIO: FromIO2 = { fromIO: flow(E.fromIO, E.map(O.some)), } /** * @since 0.9.2 * @category Constructor */ export const fromIO = FromIO.fromIO /** * @since 0.9.2 * @category Instance */ export const FromTask: FromTask2 = { ...FromIO, fromTask: flow(E.fromTask, E.map(O.some)), } /** * @since 0.9.2 * @category Constructor */ export const fromTask = FromTask.fromTask /** * @since 0.9.2 * @category Instance */ export const FromResume: FromResume2 = { fromResume: (resume: Resume) => pipe(E.fromResume(resume), E.map(O.some)), } /** * @since 0.9.2 * @category Constructor */ export const fromResume = FromResume.fromResume /** * @since 0.9.2 * @category Instance */ export const FromEnv: FromEnv2 = { fromEnv, } /** * @since 0.9.2 * @category Instance */ export const FromReader: FromReader2 = { fromReader: flow(E.fromReader, E.map(O.some)), } /** * @since 0.9.2 * @category Instance */ export const UseSome: UseSome2 = { useSome: E.useSome, } /** * @since 0.9.2 * @category Instance */ export const UseAll: UseAll2 = { useAll: E.useAll, } /** * @since 0.9.2 * @category Instance */ export const ProvideSome: ProvideSome2 = { provideSome: E.provideSome, } /** * @since 0.9.2 * @category Instance */ export const ProvideAll: ProvideAll2 = { provideAll: E.provideAll, } /** * @since 0.9.2 * @category Instance */ export const Provide: Provide2 = { ...UseAll, ...UseSome, ...ProvideSome, ...ProvideAll, } /** * @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)