/** * @typed/fp/Reader is an extension to fp-ts/Reader with ChainRec + MonadRec instances. * * @since 0.9.2 */ import { ChainRec2, tailRec } from 'fp-ts/ChainRec' import * as E from 'fp-ts/Either' import * as R from 'fp-ts/Reader' import { pipe } from './function' import { MonadRec2 } from './MonadRec' import { Provide2, ProvideAll2, ProvideSome2, UseAll2, UseSome2 } from './Provide' export * from 'fp-ts/Reader' /** * @since 0.9.2 * @category Combinator */ export const chainRec = (f: (value: A) => R.Reader>) => (value: A): R.Reader => (r) => pipe( value, tailRec((a: A) => f(a)(r)), ) /** * @since 0.9.2 * @category Instance */ export const ChainRec: ChainRec2 = { chainRec, } /** * @since 0.9.2 * @category Instance */ export const MonadRec: MonadRec2 = { ...R.Monad, chainRec, } /** * @since 0.9.2 * @category Combinator */ export const useSome = (provided: R1) => (reader: R.Reader): R.Reader => (e) => reader({ ...e, ...provided }) /** * @since 0.9.2 * @category Combinator */ export const provideSome = (provided: R1) => (reader: R.Reader): R.Reader => (e) => reader({ ...provided, ...e }) /** * @since 0.9.2 * @category Combinator */ export const useAll = (provided: R1) => (reader: R.Reader): R.Reader => () => reader(provided) /** * @since 0.9.2 * @category Combinator */ export const provideAll = (provided: R1) => (reader: R.Reader): R.Reader => (e) => reader({ ...provided, ...((e as any) ?? {}) }) /** * @since 0.9.2 * @category Instance */ export const UseSome: UseSome2 = { useSome, } /** * @since 0.9.2 * @category Instance */ export const UseAll: UseAll2 = { useAll, } /** * @since 0.9.2 * @category Instance */ export const ProvideSome: ProvideSome2 = { provideSome, } /** * @since 0.9.2 * @category Instance */ export const ProvideAll: ProvideAll2 = { provideAll, } /** * @since 0.9.2 * @category Instance */ export const Provide: Provide2 = { useSome, useAll, provideSome, provideAll, }