/** * @typed/fp/ReaderTaskEither is an extension of fp-ts/ReaderTaskEither with additional * type-class instances. * @since 0.9.2 */ import { ChainRec3 } from 'fp-ts/ChainRec' import * as E from 'fp-ts/Either' import { pipe } from 'fp-ts/function' import * as RTE from 'fp-ts/ReaderTaskEither' import { swapEithers } from './internal' import { MonadRec3 } from './MonadRec' import { Provide3, ProvideAll3, ProvideSome3, UseAll3, UseSome3 } from './Provide' import * as RT from './ReaderTask' /** * @since 0.9.2 * @category Combinator */ export const chainRec = (f: (value: A) => RTE.ReaderTaskEither>) => (value: A): RTE.ReaderTaskEither => pipe( value, RT.chainRec((a) => pipe(a, f, RT.map(swapEithers))), ) /** * @since 0.9.2 * @category Instance */ export const ChainRec: ChainRec3 = { chainRec, } /** * @since 0.9.2 * @category Instance */ export const MonadRec: MonadRec3 = { ...RTE.Monad, chainRec, } /** * @since 0.9.2 * @category Instance */ export const UseSome: UseSome3 = { useSome: RT.useSome, } /** * @since 0.9.2 * @category Combinator */ export const useSome = UseSome.useSome /** * @since 0.9.2 * @category Instance */ export const ProvideSome: ProvideSome3 = { provideSome: RT.provideSome, } /** * @since 0.9.2 * @category Combinator */ export const provideSome = ProvideSome.provideSome /** * @since 0.9.2 * @category Instance */ export const UseAll: UseAll3 = { useAll: RT.useAll, } /** * @since 0.9.2 * @category Combinator */ export const useAll = UseAll.useAll /** * @since 0.9.2 * @category Instance */ export const ProvideAll: ProvideAll3 = { provideAll: RT.provideAll, } /** * @since 0.9.2 * @category Combinator */ export const provideAll = ProvideAll.provideAll /** * @since 0.9.2 * @category Instance */ export const Provide: Provide3 = { ...UseSome, ...UseAll, ...ProvideSome, ...ProvideAll, } /** * @since 0.9.2 * @category Combinator */ export * from 'fp-ts/ReaderTaskEither'