Damir
впечатлениями
Anton
Anton
Оно хочется или оно надо?
Alex ZeroDub
всем привет. подскажите pure js реализацию Password-Based Key Derivation Function (PBKDF) ?
Alex ZeroDub
web crypto api все же не на всех браузерах
Vladislav
@iamstarkov https://github.com/5angel/quak/tree/master/src
Так лучше?
Vlad
> curry(fn, ...rest, ...more)
вот это круто
Vladislav
это был сарказм? (:
Дима
А это компилируется? 😳
Vlad
Дима
Ну, в смысле, как это вообще может работать без ошибок))
Vlad
только обычо, curry принимает функцию и возвращает каррированную функцию
Vlad
Vladislav
Alexander
но вызвать можно спокойно
Vlad
const curry = fn => (...args) => args.length < fn.length
? (...newArgs) => curry(fn)(...args.concat(newArgs))
: fn(...args)
// equals
const curry = fn => (...args) => args.length < fn.length
? (...newArgs) => curry(fn)(...args, ...newArgs) // cool!
: fn(...args)
Vlad
extend можно переписать на редьюсы
Vlad
то есть у тебя each c сайд-эффектам
Дима
Аааа, понял
Дима
А то выходит прямо второй человек после чака норриса, досчитавший до бесконечности дважды))
Vlad
Anatoly
Vlad
на самом деле даже так
export const deepExtend = (...rest) => rest.reduce(extend, {} );
Vlad
каждый раз когда тебе нужно из коллекции получить одно значение это всегда reduce
Vladislav
Object.extend нет такого метода, а Object.assign нужно полифилить
Vlad
без временных вспомогательных переменных
Vlad
https://github.com/5angel/quak/blob/master/src/utils/common.js#L7
Vlad
assign, да
Vladislav
как уже сказал, ассигн не тру
Vlad
тогда нужен мап агностичный к коллекции
Vlad
ну да ладно
Vlad
просто попробуй тут each поменять на map и for … loop на reduce
Ilya
так, я на время выйду, а то бот шлет сообщения тем, кто сюда пишет
Aleksei
Object.assign можно заменить на {...a, ...b} по идее
Vlad
да
Vlad
deepExtend = (...args) => args.reduce(
(res, val) => isArrayish(args[0])
? [ ...res, ...val ]
: { ...res, ...val }
isArrayish(args[0]) ? [] : {}
)
Vlad
но тогда для object spread тоже нужно будет подключать бабель плагин
Vlad
@kozulya update может возвращать обновлённую модель? чтобы не менять значение модели по рефу?
Vladislav
Vlad
так будет проще понять и легче тестить
Vlad
у parseAttributes один аргумент attributes
Vlad
пара временных перменных
Vlad
each который наполняет их
Vlad
и после each ты возвращаешь их массивом
Vlad
тут прямо напрашивается каррированнй мап
Vlad
const parseAttributes = (attributes = []) => {
…
each(fn, attributes)
return [handlers, bindings]
};
// =>
const parseAttributes = (attributes) => {
return map(fn, attributes)
};
// =>
const parseAttributes = (attributes) => map(fn, attributes);
// =>
const parseAttributes = map(fn);
Vlad
ну да
Vlad
ты там пушишь в эти временные массивы
Vlad
это точно мап
Vladislav
ща, я тут экстенд почти сделал
Vlad
так как ты наполняешь два разных массива то тут можно разделить их
Vlad
есть converge
Vlad
//≅ multiply( add(1, 2), subtract(1, 2) );
R.converge(multiply, [add, subtract])(1, 2); //=> -3
Vlad
const parseAttributes = converge(concat, [sumHandler, sumBindings])
Vladislav
export function extend(...rest) {
return reduce((result, obj) => {
each((value, prop) => {
result[prop] = value
}, obj)
return result
}, {}, rest)
}
вот такой extend
Vlad
Vlad
const parseAttributes = converge(concat, [sumHandler, sumBindings])
const attr2handler = attr => {
// …
return handler;
}
const attr2binding = attr => {
// …
return binding;
}
const mapAtts2handlers = map(attr2handler);
const mapAtts2bindings = map(attr2binding);
const parseAttributes = converge(concat, [mapAtts2handlers, mapAtts2bindings]);
// or
const parseAttributes = converge(concat, [map(attr2handler), map(attr2binding)]);
Vlad
parseExpressions по паттерну тоже кажется на мап можно переписать
Vlad
с walkNodes сложнее
Vladislav
Vladislav
2 аргумента не сильно отличаются от N аргументов
Vlad
Vlad
Больше функций
Vlad
Несколько маленьких функций лучше одной большой
Vlad
Их можно потом в новые комбинировать намного проще
Vlad
с walkNodes сложнее
когда использовал акорн для аккумулирования депсов не смог обойтись без временного массива =( https://github.com/iamstarkov/es-deps-from-string/blob/master/index.js#L17-L25
Vlad
@kozulya если из resolve вынести сайдэффекты isFunction(fn) && fn(scope)
Vlad
и объявить хелперы
const keys = scope =>
isObject(scope) ? Object.keys(scope) : [];
const args = (scope, ...rest) => keys(scope).concat(res);
Vlad
то вообще хорошо
Vladislav
сейчас попробую
Vlad
const resolve = (expr, fn, ...named) =>
(scope, ...rest) => new Function(
keys(scope).concat(named).join(','),
`return ${expr}`
).call(scope, ...args(scope))
export default resolve;
Vladislav
мне немного не нравится тендеция дважды выполнять операцию на одной массиве