Я только что написал этот очень минималистичный помощник по ведению журнала. - он фильтрует сообщения на основе их уровня, на самом деле ничего более.
Поскольку я хочу, чтобы эти уровни были инклюзивными, мне нужно вычислить плоский список включенных уровней в текущий. Рекурсивное сокращение в сочетании с поиском казалось разумным выбором.
Единственная проблема в том, что я имею представление о том, как описать, что делает эта функция, в терминах имени функции многократного использования, которое я могу хранить где-то между общими помощниками-редукторами.
Есть ли имя для алгоритма, выполняемого рекурсивным редукцией?
const logLevel = process.env.LOG_LEVEL;
const levels = {
info: 'info',
debug: 'debug',
warning: 'warning',
error: 'error'
}
const includes = {
[levels.debug]: [levels.info],
[levels.info]: [levels.warning],
[levels.warning]: [levels.error]
}
const format = {
simple: (strings, ...values) => strings.reduce ((l, r, i) => [l,JSON.stringify (vals[i]),r].join (''))
}
const uniqueRefSlow = (ele, ind, arr) => !~arr.indexOf (ele, ind + 1);
const Combine = lists => function concatTreeRecursive (levels, level) {
let more = lists[level]||[];
if (more.length) return more.reduce (concatTreeRecursive, [level, ...levels])
return [level, ...levels].filter (uniqueRefSlow);
};
const reduceRecursive = Combine (includes);
const combineLevels = levels => levels.reduce (reduceRecursive);
// ^ How is this operation called?
console.log (`Logging on level ${logLevel}`);
const Log = (levels = [LEVELS.info], tag = format.simple) => (strings, ...values) => {
let message = tag (strings, ...values);
if (!!~combineLevels (levels).indexOf (logLevel)) {
console.log (message);
}
return message;
}
const debug = Log ([levels.debug])
const info = Log ([levels.info]);
const warning = Log ([levels.info]);
debug`debug - filtered`
info`info`
warning`warning - included`
<script>const process = {env: {LOG_LEVEL: 'info'}}</script>