UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

119 lines 2.08 kB
import { ap as ap_ } from 'fp-ts/Chain'; import { isLeft } from 'fp-ts/Either'; /** * Extract the values being returned to the internal Fx * @category Combinator * @since 0.13.0 */ export function doFx(generatorFn) { return { [Symbol.iterator]: generatorFn, }; } /** * @category Constructor * @since 0.13.0 */ export const pure = (value) => // eslint-disable-next-line require-yield doFx(function* () { return value; }); /** * @category Constructor * @since 0.13.0 */ export const fromIO = (io) => // eslint-disable-next-line require-yield doFx(function* () { return io(); }); /** * @category URI * @since 0.13.0 */ export const URI = '@typed/fp/Fx'; /** * @category Combinator * @since 0.13.0 */ export const map = (f) => (fa) => doFx(function* () { return f(yield* fa); }); /** * @category Instance * @since 0.13.0 */ export const Functor = { URI, map, }; /** * @category Constructor * @since 0.13.0 */ export const of = pure; /** * @category Instance * @since 0.13.0 */ export const Pointed = { of, }; /** * @category Combinator * @since 0.13.0 */ export const chain = (f) => (fa) => doFx(function* () { const a = yield* fa; return yield* f(a); }); /** * @category Instance * @since 0.13.0 */ export const Monad = { ...Pointed, ...Functor, chain, }; /** * @category Combinator * @since 0.13.0 */ export const chainRec = (f) => (value) => doFx(function* () { let either = yield* f(value); while (isLeft(either)) { either = yield* f(either.left); } return either.right; }); /** * @category Instance * @since 0.13.0 */ export const ChainRec = { URI, chainRec, }; /** * @category Combinator * @since 0.13.0 */ export const ap = ap_(Monad); /** * @category Instance * @since 0.13.0 */ export const Apply = { ...Functor, ap }; /** * @category Instance * @since 0.13.0 */ export const Applicative = { ...Pointed, ...Apply }; /** * @category Instance * @since 0.13.0 */ export const FromIO = { URI, fromIO }; //# sourceMappingURL=Fx.js.map