/** * @typed/fp/ReaderEither is an extension of fp-ts/ReaderEither * * @since 0.9.2 */ import { ChainRec3 } from 'fp-ts/ChainRec' import { Either } from 'fp-ts/Either' import { pipe } from 'fp-ts/function' import * as RE from 'fp-ts/ReaderEither' import { swapEithers } from './internal' import { MonadRec3 } from './MonadRec' import { Provide3, ProvideAll3, ProvideSome3, UseAll3, UseSome3 } from './Provide' import * as R from './Reader' /** * @since 0.9.2 * @category Combinator */ export const chainRec = (f: (a: A) => RE.ReaderEither>) => (value: A): RE.ReaderEither => pipe( value, R.chainRec((a) => pipe(a, f, R.map(swapEithers))), ) /** * @since 0.9.2 * @category Instance */ export const ChainRec: ChainRec3 = { chainRec, } /** * @since 0.9.2 * @category Instance */ export const MonadRec: MonadRec3 = { ...RE.Monad, chainRec, } /** * @since 0.9.2 * @category Combinator */ export const useSome = (provided: R1) => (reader: RE.ReaderEither): RE.ReaderEither => (e) => reader({ ...e, ...provided }) /** * @since 0.9.2 * @category Combinator */ export const provideSome = (provided: R1) => (reader: RE.ReaderEither): RE.ReaderEither => (e) => reader({ ...provided, ...e }) /** * @since 0.9.2 * @category Combinator */ export const useAll = (provided: R1) => (reader: RE.ReaderEither): RE.ReaderEither => () => reader(provided) /** * @since 0.9.2 * @category Combinator */ export const provideAll = (provided: R1) => (reader: RE.ReaderEither): RE.ReaderEither => (e) => reader({ ...provided, ...((e as any) ?? {}) }) /** * @since 0.9.2 * @category Instance */ export const UseSome: UseSome3 = { useSome, } /** * @since 0.9.2 * @category Instance */ export const UseAll: UseAll3 = { useAll, } /** * @since 0.9.2 * @category Instance */ export const ProvideSome: ProvideSome3 = { provideSome, } /** * @since 0.9.2 * @category Instance */ export const ProvideAll: ProvideAll3 = { provideAll, } /** * @since 0.9.2 * @category Instance */ export const Provide: Provide3 = { useSome, useAll, provideSome, provideAll, } export * from 'fp-ts/ReaderEither'