@typed/fp
Version:
Data Structures and Resources for fp-ts
494 lines • 15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.zero = exports.altAll = exports.Alt = exports.alt = exports.chainRec = exports.Monad = exports.getApplicativeMonoid = exports.Applicative = exports.getApplySemigroup = exports.apT = exports.apSecond = exports.apS = exports.apFirst = exports.Apply = exports.chainFirst = exports.bind = exports.ap = exports.Chain = exports.tupled = exports.flap = exports.bindTo = exports.Functor = exports.Pointed = exports.URI = exports.chain = exports.map = exports.of = exports.exists = exports.elem = exports.getOrElseW = exports.getOrElse = exports.getMonoid = exports.getSemigroup = exports.getEq = exports.getShow = exports.fromNullable = exports.toLoading = exports.match = exports.match3W = exports.matchW = exports.replete = exports.refresh = exports.fromProgress = exports.loading = exports.noData = exports.hasValue = exports.isReplete = exports.isRefresh = exports.isLoading = exports.isNoData = void 0;
exports.Filterable = exports.filter = exports.filterMap = exports.partition = exports.partitionMap = exports.Compactable = exports.separate = exports.compact = exports.Traversable = exports.traverse = exports.Foldable = exports.reduceRight = exports.reduce = exports.foldMap = exports.toOption = exports.fromOption = exports.Alternative = void 0;
const tslib_1 = require("tslib");
/**
* Data is an ADT which allows you to represent all the states involved in loading a
* piece of data asynchronously.
*
* @since 0.9.2
*/
const AD = (0, tslib_1.__importStar)(require("fp-ts/Alt"));
const App = (0, tslib_1.__importStar)(require("fp-ts/Applicative"));
const Ap = (0, tslib_1.__importStar)(require("fp-ts/Apply"));
const Ch = (0, tslib_1.__importStar)(require("fp-ts/Chain"));
const Ei = (0, tslib_1.__importStar)(require("fp-ts/Either"));
const function_1 = require("fp-ts/function");
const F = (0, tslib_1.__importStar)(require("fp-ts/Functor"));
const O = (0, tslib_1.__importStar)(require("fp-ts/Option"));
const P = (0, tslib_1.__importStar)(require("./Progress"));
/**
* @since 0.9.2
* @category Refinement
*/
const isNoData = (data) => data._tag === 'NoData';
exports.isNoData = isNoData;
/**
* @since 0.9.2
* @category Refinement
*/
const isLoading = (data) => data._tag === 'Loading';
exports.isLoading = isLoading;
/**
* @since 0.9.2
* @category Refinement
*/
const isRefresh = (data) => data._tag === 'Refresh';
exports.isRefresh = isRefresh;
/**
* @since 0.9.2
* @category Refinement
*/
const isReplete = (data) => data._tag === 'Replete';
exports.isReplete = isReplete;
/**
* @since 0.9.2
* @category Refinement
*/
const hasValue = (data) => (0, exports.isRefresh)(data) || (0, exports.isReplete)(data);
exports.hasValue = hasValue;
/**
* @since 0.9.2
* @category Constructor
*/
exports.noData = { _tag: 'NoData' };
/**
* @since 0.9.2
* @category Constructor
*/
exports.loading = {
_tag: 'Loading',
progress: O.none,
};
/**
* @since 0.9.2
* @category Constructor
*/
const fromProgress = (progress) => ({
_tag: 'Loading',
progress: O.some(progress),
});
exports.fromProgress = fromProgress;
/**
* @since 0.9.2
* @category Constructor
*/
const refresh = (value, progress = O.none) => ({
_tag: 'Refresh',
value,
progress,
});
exports.refresh = refresh;
/**
* @since 0.9.2
* @category Constructor
*/
const replete = (value) => ({ _tag: 'Replete', value });
exports.replete = replete;
/**
* @since 0.9.2
* @category Deconstructor
*/
const matchW = (onNoData, onLoading, onRefresh, onReplete) => (data) => {
switch (data._tag) {
case 'NoData':
return onNoData();
case 'Loading':
return onLoading(data.progress);
case 'Refresh':
return onRefresh(data.value, data.progress);
case 'Replete':
return onReplete(data.value);
}
};
exports.matchW = matchW;
/**
* @since 0.9.2
* @category Deconstructor
*/
const match3W = (onNoData, onLoading, onRefreshOrReplete) => (data) => {
switch (data._tag) {
case 'NoData':
return onNoData();
case 'Loading':
return onLoading(data.progress);
case 'Refresh':
case 'Replete':
return onRefreshOrReplete(data.value);
}
};
exports.match3W = match3W;
/**
* @since 0.9.2
* @category Deconstructor
*/
exports.match = exports.matchW;
/**
* @since 0.9.2
* @category Combinator
*/
const toLoading = (data) => (0, function_1.pipe)(data, (0, exports.matchW)(() => exports.loading, (0, function_1.flow)(O.map(exports.fromProgress), O.getOrElse(() => exports.loading)), exports.refresh, exports.refresh));
exports.toLoading = toLoading;
/**
* @since 0.9.2
* @category Constructor
*/
const fromNullable = (a) => a === null || a === undefined ? exports.noData : (0, exports.replete)(a);
exports.fromNullable = fromNullable;
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
const getShow = (S) => ({
show: (0, exports.matchW)((0, function_1.constant)('NoData'), O.matchW(() => `Loading`, (p) => `Loading(${P.Show.show(p)})`), (v, p) => (0, function_1.pipe)(p, O.matchW(() => `Refresh(${S.show(v)})`, (p) => `Refresh(${S.show(v)}, ${P.Show.show(p)})`)), (v) => `Replete(${S.show(v)})`),
});
exports.getShow = getShow;
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
const getEq = (S) => {
const OptionProgressEq = O.getEq(P.Eq);
return {
equals: (a) => (b) => (0, function_1.pipe)(a, (0, exports.matchW)(() => (0, exports.isNoData)(b), (p) => (0, exports.isLoading)(b) && OptionProgressEq.equals(p)(b.progress), (a, p) => (0, exports.isRefresh)(b) && S.equals(a)(b.value) && OptionProgressEq.equals(p)(b.progress), (a) => (0, exports.isReplete)(b) && S.equals(a)(b.value))),
};
};
exports.getEq = getEq;
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
const getSemigroup = (S) => {
const OptionProgressSemigroup = O.getMonoid(P.Semigroup);
return {
concat: (secondD) => (firstD) => (0, function_1.pipe)(firstD, (0, exports.matchW)((0, function_1.constant)(secondD), // Empty value
(fp) => (0, function_1.pipe)(secondD, (0, exports.matchW)((0, function_1.constant)(firstD), (0, function_1.constant)(firstD), (second, sp) => (0, exports.refresh)(second, OptionProgressSemigroup.concat(sp)(fp)), exports.refresh)), (first, fp) => (0, function_1.pipe)(secondD, (0, exports.matchW)((0, function_1.constant)(firstD), (0, function_1.constant)(firstD), (second, sp) => (0, exports.refresh)((0, function_1.pipe)(first, S.concat(second)), OptionProgressSemigroup.concat(sp)(fp)), (second) => (0, exports.refresh)((0, function_1.pipe)(first, S.concat(second)), fp))), (first) => (0, function_1.pipe)(secondD, (0, exports.matchW)((0, function_1.constant)(firstD), (sp) => (0, exports.refresh)(first, sp), (second, sp) => (0, exports.refresh)((0, function_1.pipe)(first, S.concat(second)), sp), (second) => (0, exports.replete)((0, function_1.pipe)(first, S.concat(second))))))),
};
};
exports.getSemigroup = getSemigroup;
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
const getMonoid = (S) => ({
...(0, exports.getSemigroup)(S),
empty: exports.noData,
});
exports.getMonoid = getMonoid;
/**
* @since 0.9.2
* @category Combinator
*/
const getOrElse = (onInitial, onLoading) => (ma) => (0, exports.match3W)(onInitial, onLoading, function_1.identity)(ma);
exports.getOrElse = getOrElse;
/**
* @since 0.9.2
* @category Combinator
*/
const getOrElseW = (onInitial, onLoading) => (ma) => (0, exports.match3W)(onInitial, onLoading, function_1.identity)(ma);
exports.getOrElseW = getOrElseW;
/**
* @since 0.9.2
* @category Combinator
*/
const elem = (E) => (a) => (ma) => (0, exports.match3W)(function_1.constFalse, function_1.constFalse, E.equals(a))(ma);
exports.elem = elem;
/**
* @since 0.9.2
* @category Combinator
*/
const exists = (predicate) => (ma) => (0, function_1.pipe)(ma, (0, exports.match3W)(function_1.constFalse, function_1.constFalse, predicate));
exports.exists = exists;
/**
* @since 0.9.2
* @category Constructor
*/
const of = (value) => (0, exports.replete)(value);
exports.of = of;
/**
* @since 0.9.2
* @category Combinator
*/
const map = (f) => (data) => (0, function_1.pipe)(data, (0, exports.matchW)((0, function_1.constant)(exports.noData), (0, function_1.flow)(O.map(exports.fromProgress), O.getOrElse(() => exports.loading)), (a, p) => (0, exports.refresh)(f(a), p), (0, function_1.flow)(f, exports.replete)));
exports.map = map;
/**
* @since 0.9.2
* @category Combinator
*/
const chain = (f) => (data) => (0, function_1.pipe)(data, (0, exports.match3W)((0, function_1.constant)(exports.noData), (0, function_1.flow)(O.map(exports.fromProgress), O.getOrElse(() => exports.loading)), f));
exports.chain = chain;
/**
* @since 0.9.2
* @category URI
*/
exports.URI = '@typed/fp/Data';
/**
* @since 0.9.2
* @category Instance
*/
exports.Pointed = {
of: exports.of,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.Functor = {
map: exports.map,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.bindTo = F.bindTo(exports.Functor);
/**
* @since 0.9.2
* @category Combinator
*/
exports.flap = F.flap(exports.Functor);
/**
* @since 0.9.2
* @category Combinator
*/
exports.tupled = F.tupled(exports.Functor);
/**
* @since 0.9.2
* @category Instance
*/
exports.Chain = {
...exports.Functor,
chain: exports.chain,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.ap = Ch.ap(exports.Chain);
/**
* @since 0.9.2
* @category Combinator
*/
exports.bind = Ch.bind(exports.Chain);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainFirst = Ch.chainFirst(exports.Chain);
/**
* @since 0.9.2
* @category Instance
*/
exports.Apply = {
...exports.Functor,
ap: exports.ap,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.apFirst = Ap.apFirst(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apS = Ap.apS(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apSecond = Ap.apSecond(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apT = Ap.apT(exports.Apply);
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
exports.getApplySemigroup = Ap.getApplySemigroup(exports.Apply);
/**
* @since 0.9.2
* @category Instance
*/
exports.Applicative = {
...exports.Apply,
...exports.Pointed,
};
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
exports.getApplicativeMonoid = App.getApplicativeMonoid(exports.Applicative);
/**
* @since 0.9.2
* @category Instance
*/
exports.Monad = {
...exports.Chain,
...exports.Pointed,
};
/**
* @since 0.9.2
* @category Combinator
*/
const chainRec = (f) => (value) => {
let data = f(value);
while (!(0, exports.isNoData)(data) && !(0, exports.isLoading)(data)) {
if (Ei.isRight(data.value)) {
return (0, exports.replete)(data.value.right);
}
data = f(data.value.left);
}
return data;
};
exports.chainRec = chainRec;
/**
* @since 0.9.2
* @category Combinator
*/
const alt = (f) => (b) => (0, function_1.pipe)(b, (0, exports.matchW)(f, f, exports.refresh, exports.replete));
exports.alt = alt;
/**
* @since 0.9.2
* @category Instance
*/
exports.Alt = {
...exports.Functor,
alt: exports.alt,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.altAll = AD.altAll(exports.Alt);
/**
* @since 0.9.2
* @category Constructor
*/
const zero = () => exports.noData;
exports.zero = zero;
/**
* @since 0.9.2
* @category Instance
*/
exports.Alternative = {
...exports.Alt,
zero: exports.zero,
};
/**
* @since 0.9.2
* @category Natural Transformation
*/
const fromOption = (option) => (0, function_1.pipe)(option, O.matchW(() => exports.noData, exports.replete));
exports.fromOption = fromOption;
/**
* @since 0.9.2
* @category Natural Transformation
*/
const toOption = (data) => (0, function_1.pipe)(data, (0, exports.matchW)(() => O.none, () => O.none, O.some, O.some));
exports.toOption = toOption;
/**
* @since 0.9.2
* @category Combinator
*/
function foldMap(M) {
return (f) => (fa) => (0, function_1.pipe)(fa, (0, exports.match3W)(() => M.empty, () => M.empty, f));
}
exports.foldMap = foldMap;
/**
* @since 0.9.2
* @category Deconstructor
*/
const reduce = (seed, f) => (data) => (0, function_1.pipe)(data, (0, exports.match3W)((0, function_1.constant)(seed), (0, function_1.constant)(seed), (b) => f(seed, b)));
exports.reduce = reduce;
/**
* @since 0.9.2
* @category Deconstructor
*/
const reduceRight = (seed, f) => (data) => (0, function_1.pipe)(data, (0, exports.match3W)((0, function_1.constant)(seed), (0, function_1.constant)(seed), (b) => f(b, seed)));
exports.reduceRight = reduceRight;
/**
* @since 0.9.2
* @category Instance
*/
exports.Foldable = {
reduce: exports.reduce,
foldMap,
reduceRight: exports.reduceRight,
};
/**
* @since 0.9.2
* @category Combinator
*/
function traverse(F) {
return (f) => (data) => (0, function_1.pipe)(data, (0, exports.matchW)(() => F.of(exports.noData), O.matchW(() => F.of(exports.loading), (p) => F.of((0, exports.fromProgress)(p))), (a, progress) => (0, function_1.pipe)(a, f, F.map((b) => (0, exports.refresh)(b, progress))), (0, function_1.flow)(f, F.map(exports.replete))));
}
exports.traverse = traverse;
/**
* @since 0.9.2
* @category Instance
*/
exports.Traversable = {
...exports.Functor,
traverse,
};
/**
* @since 0.9.2
* @category Combinator
*/
const compact = (dataOption) => (0, function_1.pipe)(dataOption, (0, exports.chain)(O.matchW(() => exports.noData, exports.replete)));
exports.compact = compact;
/**
* @since 0.9.2
* @category Combinator
*/
const separate = (dataEither) => {
return {
left: (0, function_1.pipe)(dataEither, (0, exports.chain)(Ei.matchW(exports.replete, () => exports.noData))),
right: (0, function_1.pipe)(dataEither, (0, exports.chain)(Ei.matchW(() => exports.noData, exports.replete))),
};
};
exports.separate = separate;
/**
* @since 0.9.2
* @category Instance
*/
exports.Compactable = {
compact: exports.compact,
separate: exports.separate,
};
/**
* @since 0.9.2
* @category Combinator
*/
const partitionMap = (f) => (fa) => (0, function_1.pipe)(fa, (0, exports.map)(f), exports.separate);
exports.partitionMap = partitionMap;
/**
* @since 0.9.2
* @category Combinator
*/
exports.partition = (0, function_1.flow)(Ei.fromPredicate, exports.partitionMap);
/**
* @since 0.9.2
* @category Combinator
*/
const filterMap = (f) => (fa) => (0, function_1.pipe)(fa, (0, exports.map)(f), exports.compact);
exports.filterMap = filterMap;
/**
* @since 0.9.2
* @category Combinator
*/
exports.filter = (0, function_1.flow)(O.fromPredicate, exports.filterMap);
/**
* @since 0.9.2
* @category Instance
*/
exports.Filterable = {
partitionMap: exports.partitionMap,
partition: exports.partition,
filterMap: exports.filterMap,
filter: exports.filter,
};
//# sourceMappingURL=Data.js.map