
Anton
25.08.2016
19:00:21
Оно хочется или оно надо?

abc
25.08.2016
19:05:58
всем привет. подскажите pure js реализацию Password-Based Key Derivation Function (PBKDF) ?
web crypto api все же не на всех браузерах

Владислав
25.08.2016
21:28:00
@iamstarkov https://github.com/5angel/quak/tree/master/src
Так лучше?

Google

Vladimir
25.08.2016
21:29:21
> curry(fn, ...rest, ...more)
вот это круто

Владислав
25.08.2016
21:31:40
это был сарказм? (:

Дмитрий
25.08.2016
21:32:59
А это компилируется? ?

Vladimir
25.08.2016
21:33:17

Дмитрий
25.08.2016
21:33:18
Ну, в смысле, как это вообще может работать без ошибок))

Alexander
25.08.2016
21:34:35

Vladimir
25.08.2016
21:35:04
только обычо, curry принимает функцию и возвращает каррированную функцию

Дмитрий
25.08.2016
21:36:34

Alexander
25.08.2016
21:37:19

Владислав
25.08.2016
21:37:23

Alexander
25.08.2016
21:37:24
но вызвать можно спокойно

Vladimir
25.08.2016
21:38:39

Google

Vladimir
25.08.2016
21:38:49
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)
extend можно переписать на редьюсы
то есть у тебя each c сайд-эффектам

Дмитрий
25.08.2016
21:42:26
Аааа, понял

Владислав
25.08.2016
21:42:41

Дмитрий
25.08.2016
21:42:46
А то выходит прямо второй человек после чака норриса, досчитавший до бесконечности дважды))

Alexander
25.08.2016
21:46:29

Vladimir
25.08.2016
21:47:28

Anatoly
25.08.2016
21:47:31

Vladimir
25.08.2016
21:48:10
на самом деле даже так
export const deepExtend = (...rest) => rest.reduce(extend, {} );
каждый раз когда тебе нужно из коллекции получить одно значение это всегда reduce

Владислав
25.08.2016
21:49:44
Object.extend нет такого метода, а Object.assign нужно полифилить

Vladimir
25.08.2016
21:49:59
без временных вспомогательных переменных
https://github.com/5angel/quak/blob/master/src/utils/common.js#L7
assign, да

Владислав
25.08.2016
21:50:43
как уже сказал, ассигн не тру

Vladimir
25.08.2016
21:51:12
тогда нужен мап агностичный к коллекции
ну да ладно

Google

Vladimir
25.08.2016
21:52:39
просто попробуй тут each поменять на map и for … loop на reduce

Ilya
25.08.2016
21:52:47
так, я на время выйду, а то бот шлет сообщения тем, кто сюда пишет

Aleksei
25.08.2016
21:55:39
Object.assign можно заменить на {...a, ...b} по идее

Vladimir
25.08.2016
21:56:23
да
deepExtend = (...args) => args.reduce(
(res, val) => isArrayish(args[0])
? [ ...res, ...val ]
: { ...res, ...val }
isArrayish(args[0]) ? [] : {}
)
но тогда для object spread тоже нужно будет подключать бабель плагин
@kozulya update может возвращать обновлённую модель? чтобы не менять значение модели по рефу?

Владислав
25.08.2016
22:03:58

Vladimir
25.08.2016
22:04:28
так будет проще понять и легче тестить
у parseAttributes один аргумент attributes
пара временных перменных
each который наполняет их

Vladimir
25.08.2016
22:06:56
и после each ты возвращаешь их массивом
тут прямо напрашивается каррированнй мап
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);
ну да
ты там пушишь в эти временные массивы

Admin
ERROR: S client not available

Vladimir
25.08.2016
22:11:12
это точно мап

Владислав
25.08.2016
22:12:07
ща, я тут экстенд почти сделал

Google

Vladimir
25.08.2016
22:13:04
так как ты наполняешь два разных массива то тут можно разделить их
есть converge
//≅ multiply( add(1, 2), subtract(1, 2) );
R.converge(multiply, [add, subtract])(1, 2); //=> -3
const parseAttributes = converge(concat, [sumHandler, sumBindings])

Владислав
25.08.2016
22:15:01
export function extend(...rest) {
return reduce((result, obj) => {
each((value, prop) => {
result[prop] = value
}, obj)
return result
}, {}, rest)
}
вот такой extend

Vladimir
25.08.2016
22:17:35
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)]);
parseExpressions по паттерну тоже кажется на мап можно переписать
с walkNodes сложнее

Владислав
25.08.2016
22:29:45
2 аргумента не сильно отличаются от N аргументов

Vladimir
25.08.2016
22:32:15
Больше функций
Несколько маленьких функций лучше одной большой
Их можно потом в новые комбинировать намного проще
с walkNodes сложнее
когда использовал акорн для аккумулирования депсов не смог обойтись без временного массива =( https://github.com/iamstarkov/es-deps-from-string/blob/master/index.js#L17-L25
@kozulya если из resolve вынести сайдэффекты isFunction(fn) && fn(scope)
и объявить хелперы
const keys = scope =>
isObject(scope) ? Object.keys(scope) : [];
const args = (scope, ...rest) => keys(scope).concat(res);
то вообще хорошо

Владислав
25.08.2016
22:45:28
сейчас попробую

Google

Vladimir
25.08.2016
22:47:39
const resolve = (expr, fn, ...named) =>
(scope, ...rest) => new Function(
keys(scope).concat(named).join(','),
`return ${expr}`
).call(scope, ...args(scope))
export default resolve;

Владислав
25.08.2016
22:53:47
мне немного не нравится тендеция дважды выполнять операцию на одной массиве
резолв же будет постоянно вызываться, еще и на больших объектах, к примеру

Vladimir
25.08.2016
23:28:47
если он будет чистый его можно будет мемоизировать