@typed/fp
Version:
Data Structures and Resources for fp-ts
44 lines • 1.01 kB
JavaScript
import * as E from 'fp-ts/Either';
import { pipe } from 'fp-ts/function';
import * as O from 'fp-ts/Option';
import * as S from './struct';
/**
* @since 0.9.2
* @category Combinator
*/
export const chainRec = (f) => (value) => {
let option = f(value);
while (O.isSome(option)) {
if (E.isRight(option.value)) {
return O.some(option.value.right);
}
option = f(option.value.left);
}
return option;
};
/**
* @since 0.12.1
* @category Constructor
*/
export const struct = (opts) => {
const { concat } = O.getMonoid(S.getAssignSemigroup());
const entries = Object.entries(opts);
return entries.reduce((acc, [k, o]) => pipe(acc, concat(pipe(o, O.map((v) => S.make(k, v))))), O.none);
};
/**
* @since 0.9.2
* @category Typeclass
*/
export const ChainRec = {
chainRec,
};
/**
* @since 0.9.2
* @category Typeclass
*/
export const MonadRec = {
...O.Monad,
...ChainRec,
};
export * from 'fp-ts/Option';
//# sourceMappingURL=Option.js.map