Files
is-a-dev/utils/helpers.js
T
2024-07-29 08:34:45 +08:00

55 lines
1.4 KiB
JavaScript

const R = require("ramda");
const { IS_TEST } = require("./constants");
const log = IS_TEST ? () => {} : console.log;
const print = (fn) => (x) => log(fn(x)) || x;
const between = (min, max) => (num) => num >= min && num <= max;
const testRegex = (regex) => (str) => !!(str && str.match(regex));
const validate = (pattern) => (data) =>
R.compose(
(invalidPairs) =>
invalidPairs.length
? { errors: invalidPairs, valid: false }
: { errors: [], valid: true },
R.filter(([key, { fn }]) => (fn ? !fn(data[key]) : false)),
R.toPairs,
)(pattern);
const or = R.anyPass;
const and = R.allPass;
const then = (fn) => (p) => p.then(fn);
const lazyTask = (fn) => (data) => () => fn(data);
const batchLazyTasks = (count) => (tasks) =>
tasks.reduce((batches, task) => {
if (batches.length === 0) return [[task]];
const full = R.init(batches);
const last = R.last(batches);
if (last.length >= count) return [...batches, [task]];
return [...full, [...last, task]];
}, []);
const withLengthGte = (n) => R.compose(R.gte(R.__, n), R.length);
const withLengthEq = (n) => R.compose(R.equals(n), R.length);
module.exports = {
or,
and,
validate,
between,
testRegex,
log,
print,
then,
lazyTask,
batchLazyTasks,
withLengthEq,
withLengthGte,
};