
Yumi
05.06.2017
18:12:21

Сергей
05.06.2017
18:20:25

Google

Сергей
05.06.2017
18:20:39
Как имена пакетов нпм

Yumi
05.06.2017
18:20:57
Я так тоже использую kebab-case, но не думал, что это стандарт.

Сергей
05.06.2017
18:22:09
Ну нпм не позволяет верхний регистр в имени пакета
snake_case это удел рубистов

Aleh
05.06.2017
18:22:49
в имени пакетов kebab юзаем, а так PascalCase
хз, лично мне вообще без разницы)

Kirill
05.06.2017
18:57:43

Vladimir
05.06.2017
18:58:39

Kirill
05.06.2017
18:58:54
Да этим то и мне нравится.
Но где грань, после которой идёт потеря производительности? Просто боюсь увлечься этой декларативностью в ущерб производительности.

Aleh
05.06.2017
19:08:35
решай проблемы по мере их поступления

Kirill
05.06.2017
19:10:58
Думаю, что в случае больших массивов данных (>1000 элементов) при расчётах в реалтайме(<500мс) уже стоит задуматься о for и if.

Aleh
05.06.2017
19:13:09
быстродействие можно померять по работающим фичам

Google

Yumi
05.06.2017
19:42:58

Kirill
05.06.2017
19:45:58
Я имею ввиду случаи, когда мы проходим массив не один раз и делаем все необходимые преобразования над ним с помощью for, а повторяющиеся проходы с помощью map, filter и т.п. Тут же будет потеря.

Yumi
05.06.2017
19:48:01
Думаю сейчас настолько все оптимизировано, что там потеря будет настолько незначительной, что не имеет смысла использовать for, а если уже есть смысл, то стоит задумать про webassembly, это уже не для js работа, кмк.

Aleh
05.06.2017
19:54:24

Дмитрий
05.06.2017
19:55:36

Yumi
05.06.2017
19:56:22
Не отрицаю. ?

Дмитрий
05.06.2017
19:57:40
Из-за большого числа пересоздающихся функций, а так же из-за потрясающей универсальности либы, её реализация реально не совсем катит для мега быстрых задач. Но в среднем проекте таких задач как правило от одной до нуля))

Kirill
05.06.2017
19:59:18

Дмитрий
05.06.2017
20:00:13
uniqBy по двум тысячам координат ?? сурово)

Aleh
05.06.2017
20:00:23
перед каждым рендером
жестко

Дмитрий
05.06.2017
20:00:26
Его проблема же именно в uniq)

Aleh
05.06.2017
20:01:24

Yumi
05.06.2017
20:02:19

Aleh
05.06.2017
20:03:21
другое дело, что экономить до того, как бенч показал, что тормозит редко есть смысл
т.е. еще реже, чем бывает сам кейс больших данных

Yumi
05.06.2017
20:05:20
Ну мне кажется можно по разному оптимизировать, хотя да, цикл как вариант неплохой, но и не единственный.

Дмитрий
05.06.2017
20:05:39
Самое смешное, что нативный .map далеко не самый быстрый)

Google

Дмитрий
05.06.2017
20:06:21
Потому что реализован банально на жс и по спеке обязан учитывать "дырки" в массивах, что замедляет его

Aleh
05.06.2017
20:07:09


Дмитрий
05.06.2017
20:13:50
На счёт быстродействия. Что, настолько всё медленно с Рамдой работает, что выпилил? А в каких кейсах тогда профит от неё?
Начну немного с отвлеченного примера ?
Как то раз я протяжении двух недель не мог поймать странный плавающий баг — тупо не проходила авторизация, возникало ощущение, что запросы к серверу "проскальзывают" мимо друг друга.
Для его исправления мне оказалось достаточно закомментировать один неудачный console.log ?
Текущие ттх этого модуля: мемоизация всех возможных аргументов, данные выводятся с задержкой во избежание конфликта с важными вычислениями, сообщения для эффективности собираются в два уровня буферизации, а пиковая скорость вывода данных в максимально вербозном режиме достигает двух мегабайт в секунду)
В общем этот модуль — это крайне критичное к быстродействию место?

Vladimir
05.06.2017
20:17:23
потом бенчи

Aleh
05.06.2017
20:23:23

Denis
06.06.2017
06:16:58

Дмитрий
06.06.2017
07:34:43
Я пока счёл достаточным, что там вся эта операция быстро мемоизируется, так как список этих тегов — конечен

andretshurotshka?❄️кде
06.06.2017
09:53:55

Дмитрий
06.06.2017
10:51:54
В разных частях кода вызывается
log`tag,messages,description`(...data)
С этими тегами в бэктиках производится довольно много преобразований для требуемого форматирования, поэтому они все создаются только при первом вызове такого лог-сообщения

Vadim
06.06.2017
14:12:05
Народ, а где можно посмотреть versions history по ramda?
Что б при появлении каждой новой версии сразу видеть список новых или модифицированных методов?

Дмитрий
06.06.2017
14:12:37
У них в issues

Denis
06.06.2017
14:12:42
https://github.com/ramda/ramda/issues?q=is%3Aissue+is%3Aopen+label%3A%22upgrade+guide%22
https://github.com/ramda/ramda/issues?q=is%3Aissue+label%3A%22upgrade+guide%22+is%3Aclosed
первое это открытые и второе это уже релизы бывшие
как вы смотрите на то, что я выложу все пейперы (pdf) о Recursion Schemes (все, что я находил, когда разбирался с этой темой)

Vadim
06.06.2017
14:14:27
@xgrommx спасибо!
У них в issues
Конечно это не очень хорошо говорит о "поставленности" проекта )

Google

Дмитрий
06.06.2017
14:16:42
Да они странные просто

Vadim
06.06.2017
14:17:06
Им просто плевать на то, будут ли их продукт юзать

Дмитрий
06.06.2017
14:17:23
Там полноценные посты по изменениям, нет никакой разницы куда их постить, но делают почему то там

Denis
06.06.2017
14:18:00
все эти mergeDeepWith.. есть просто рекурсивные версии mergeWith
в них я не увидел что надо было так api раздувать

andretshurotshka?❄️кде
06.06.2017
14:18:13

Дмитрий
06.06.2017
14:19:02
Хз, это не отменяет же release notes

Admin
ERROR: S client not available

Denis
06.06.2017
14:20:17
ну это конечно умно https://github.com/ramda/ramda/blob/master/CHANGELOG.md

Дмитрий
06.06.2017
14:31:38
innerJoin кстати хорошая штука)

Denis
06.06.2017
14:31:55
хм
это же просто filter + contains

? animufag ?
06.06.2017
14:34:16

Дмитрий
06.06.2017
14:34:51

Denis
06.06.2017
14:35:19
функторная алгебра что заменяет примитивную и структурную рекурсии корекурсии (ну всякие cata,ana,para,apo,hylo) морфизмы

Aleh
06.06.2017
14:35:49

Denis
06.06.2017
14:57:15
2 варианта
const innerJoin_ = (p, xs, ys) => xs.filter(x => ys.filter(y => p(x, y)).length > 0)
const innerJoin__ = (p, xs, ys) => chain(x => chain(y => p(x, y) ? x : [], ys), xs)
можно даже так)
const innerJoin_ = (p, xs, ys) => xs.filter(x => ys.some(y => p(x, y)))

Google


Kirill
06.06.2017
15:37:56
Помогите переписать вот этот небольшой кусок на чистую композицию. Что-то не пойму как впихнуть R.ifElse в R.pipe и захватывать внешние переменные.
http://ramdajs.com/repl/#?const%20STATUS_LIST%20%3D%20%5B%27active%27%2C%20%27draft%27%5D%3B%0Aconst%20payload%20%3D%20%7B%0A%20%20state%3A%20true%2C%0A%20%20status%3A%20%27active%27%2C%0A%20%20newDataLength%3A%202%2C%0A%20%20canDelete%3A%20true%2C%0A%7D%3B%0A%0Aconst%20changer%20%3D%20R.pipe%28%0A%20%20payload%20%3D%3E%20STATUS_LIST.includes%28payload.status%29%0A%20%20%3F%20%7B%0A%20%20%20%20...payload%2C%0A%20%20%20%20state%3A%20payload.newDataLength%20%3E%3D%201%2C%0A%20%20%7D%0A%20%20%3A%20%7B%0A%20%20%20%20...payload%2C%0A%20%20%20%20state%3A%20false%2C%0A%20%20%7D%2C%0A%20%20%28%7B%20state%2C%20canDelete%20%7D%29%20%3D%3E%20state%20%26%26%20canDelete%2C%0A%29%3B%0A%0Aconsole.log%28changer%28payload%29%29%3B
Только там я хреново payload назвал, глобальный который.
Захватываю я STATUS_LIST, чтобы в payload не пихать.


Дмитрий
06.06.2017
15:55:02
Отказ от переменных ради отказа от переменных не нужен, если проще написать с ними — пиши, это ок) Стиль рамды позволяет абстрагироваться от конкретных объектов и описывать операции в общем виде, в универсальной и краткой форме
Большую часть времени в обычном жс рамда выступает в качестве эффективного средства для функций - однострочников) Никаких упоротых «композ через композ», просто какие - то атомарные операции в три-четыре последовательных действия
Потом начинаешь замечать, что всё большая и большая часть задач оказывается атомарной да и вообще повторяется
А попытаться сразу писать point-free-everything — это прямой путь к fp fatigue, сколько раз уже наблюдал подобное ?

Сергей
06.06.2017
15:56:44
Забрал себе в архив. Спасибо

Дмитрий
06.06.2017
15:56:58
Вообще неочевидный момент, но если чувствуешь, что код "не катит" как фп то лучше эту попытку оставить)
Причина в том, что структуры данных просто плохо подходят под такую форму

Vadim
06.06.2017
16:01:52

Дмитрий
06.06.2017
16:02:14
Рамда на самом деле не бессвязный набор однострочников, у нее есть определенные принципы, и значительная часть библиотеки направлена на то, чтобы эффективно и гибко работать со структурами данных, которые этим принципам отвечают
Для обычных объектов point free запись постоянно встаёт поперёк, ну просто так неудобно работать

Vadim
06.06.2017
16:04:23

Дмитрий
06.06.2017
16:04:53
А для объектов отвечающих спеке fantasy-land рамда — это как рельсы, с ускорителем)


? animufag ?
06.06.2017
16:05:12
Помогите переписать вот этот небольшой кусок на чистую композицию. Что-то не пойму как впихнуть R.ifElse в R.pipe и захватывать внешние переменные.
http://ramdajs.com/repl/#?const%20STATUS_LIST%20%3D%20%5B%27active%27%2C%20%27draft%27%5D%3B%0Aconst%20payload%20%3D%20%7B%0A%20%20state%3A%20true%2C%0A%20%20status%3A%20%27active%27%2C%0A%20%20newDataLength%3A%202%2C%0A%20%20canDelete%3A%20true%2C%0A%7D%3B%0A%0Aconst%20changer%20%3D%20R.pipe%28%0A%20%20R.ifElse%28%0A%20%20%20%20payload%20%3D%3E%20STATUS_LIST.includes%28payload.status%29%0A%20%20%2C%20payload%20%3D%3E%20%28%7B%0A%20%20%20%20...payload%2C%0A%20%20%20%20state%3A%20payload.newDataLength%20%3E%3D%201%2C%0A%20%20%7D%29%0A%20%20%2C%20payload%20%3D%3E%20%28%7B%0A%20%20%20%20...payload%2C%0A%20%20%20%20state%3A%20false%2C%0A%20%20%7D%29%29%2C%0A%20%20%28%7B%20state%2C%20canDelete%20%7D%29%20%3D%3E%20state%20%26%26%20canDelete%2C%0A%29%3B%0A%0Aconst%20changer_%20%3D%20%0A%20%28%7Bstatus%2C%20newDataLength%2C%20canDelete%7D%29%20%3D%3E%20%0A%20%20STATUS_LIST.includes%28status%29%20%26%26%20newDataLength%20%3E%3D%201%20%26%26%20canDelete%0A%0Aconsole.log%28changer%28payload%29%29%3B