UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

494 lines 15 kB
"use strict"; 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