@typed/fp
Version:
Data Structures and Resources for fp-ts
119 lines • 2.08 kB
JavaScript
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