Damir
впечатлениями
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
это был сарказм? (:
Дима
А это компилируется? 😳
Дима
Ну, в смысле, как это вообще может работать без ошибок))
Alexander
Ну, в смысле, как это вообще может работать без ошибок))
а в чем проблема? это можно через curry.apply(null, [fn].concat(rest).concat(more)) сэмулировать/транспилировать
Vlad
только обычо, curry принимает функцию и возвращает каррированную функцию
Дима
spread operator же
Это то понятно, но дважды?
Alexander
Это то понятно, но дважды?
ну, написать функцию с такой сигнатурой не получится
Alexander
но вызвать можно спокойно
Vlad
Это то понятно, но дважды?
тебе же нужно аккумулировать аргументы
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 сайд-эффектам
Дима
Аааа, понял
Vladislav
extend можно переписать на редьюсы
нужен пример, для меня это пока ничего не говорит (ну кроме редьюса в массиве)
Дима
ну, написать функцию с такой сигнатурой не получится
Ппц, я реально сначала пытался представить, как это можно написать))
Дима
А то выходит прямо второй человек после чака норриса, досчитавший до бесконечности дважды))
Alexander
ну, написать функцию с такой сигнатурой не получится
Вернее, в JS не получится. В языке с типизацией можно.
Vlad
Вернее, в JS не получится. В языке с типизацией можно.
типизацию можно форсировать контрактами
Anatoly
ребята, поделитесь опытом разработки на ext.js
Что именно интересует? Это RIA фреймворк
Vlad
нужен пример, для меня это пока ничего не говорит (ну кроме редьюса в массиве)
если брать в расчёты только объекты, то будет примерно так: export const extend = curry(( a, b ) => Object.extend({}, a, b)); export const deepExtend = (...rest) => rest.reduce( (res, obj) => extend(res, obj), {} );
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 может возвращать обновлённую модель? чтобы не менять значение модели по рефу?
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
export function extend(...rest) { return reduce((result, obj) => { each((value, prop) => { result[prop] = value }, obj) return result }, {}, rest) } вот такой extend
попробуй написать extend для двух аргументов и выразить через него extend для многих аргументов
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
2 аргумента не сильно отличаются от N аргументов
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
мне немного не нравится тендеция дважды выполнять операцию на одной массиве