-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
38 lines (37 loc) · 1.25 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* curry wrapper.
* @example
* const infl = Infl({ one: '{} яблоко', zero: 'нет яблок', some: '{} яблока', many: '{} яблок' })
* infl(100500) // --> '100500 яблок'
*/
module.exports = function (count, patterns) {
if (arguments.length === 1 && arguments[0].toString() === "[object Object]") {
const patterns_ = arguments[0];
return (count) => inflect(count, patterns_);
}
return inflect(count, patterns);
};
/**
* @param {Number} count
* @param {Object} patterns
* @param {String} patterns.zero - Файлы не загружены
* @param {String} patterns.one - Загружен {} файл
* @param {String} patterns.some - Загружено {} файла
* @param {String} patterns.many - Загружено {} файлов
*/
function inflect(_count, patterns) {
const count = Math.abs(_count);
const res = {};
Object.keys(patterns).forEach((key) => {
const pattern = patterns[key];
res[key] =
typeof pattern === "string"
? pattern.replace("{}", _count)
: pattern(_count);
});
if (!count) return res.zero;
if (count >= 11 && count <= 14) return res.many;
if (count % 10 === 1) return res.one;
if (count % 10 >= 2 && count % 10 <= 4) return res.some;
return res.many;
}