
andretshurotshka?❄️кде
16.07.2017
10:24:11
лол

illiatshurotshka❄️
16.07.2017
10:24:35
I understand your point, but your methods are slower than it you should be. Complex abstractions, like arrays, sort and reduce are not the best tools for this kind of task. If you want to teach people how to use these methods, you should use an example where these methods are the best way to go.

andretshurotshka?❄️кде
16.07.2017
10:25:10

Google

Дмитрий
16.07.2017
10:26:04

illiatshurotshka❄️
16.07.2017
10:26:21

Дмитрий
16.07.2017
10:26:36
Обратный случай при этом не уточняется

Vadim
16.07.2017
10:30:45
Короче, если я правильно понял, монада IO решает те же задачи, что делает flatMap в FRP? И, использовать ее стоит только тогда, когда ты не хочешь связываться с FRP-библиотеками?

Дмитрий
16.07.2017
10:31:21
Я вообще Future использую
В стримах у тебя всего один нормально описываемый вариант "течения" событий, в Future — сразу два

Vadim
16.07.2017
10:31:56
Не понял
Про вариант течения событий

Дмитрий
16.07.2017
10:32:38
Promise.reject(0).then( val => Promise.reject( val + 1 ))

andretshurotshka?❄️кде
16.07.2017
10:32:42

Дмитрий
16.07.2017
10:32:53
Да, я тоже про него думал
Но он корректно не типизируется
Потому что Stream<Type>, а Future<Left, Right>

Google

illiatshurotshka❄️
16.07.2017
10:34:02
Stream<Future<L, R>>
ez

Дмитрий
16.07.2017
10:34:15
Про вариант течения событий
Вот пример выше — это перемещение числа по ветке reject. Только он корявый, а в Future вместо него можно просто делать .mapRej

Vadim
16.07.2017
10:34:23

Дмитрий
16.07.2017
10:34:51
Там стримы от двух дженериков?

Vadim
16.07.2017
10:35:27
Насколько помню да
В ts
Да и для promise вроде так же
Пока единственную причину использования я вижу - это если действительно тебе просто не хочется связываться с FRP-либами
Хотя этот довод слабый, так как они сейчас довольно модульны обычно

Дмитрий
16.07.2017
10:37:34
Сейчас проверил специально
Такого нет нигде
Вообще
Промисы — от одного дженерика, обсерваблы и стримы тоже

Vadim
16.07.2017
10:39:21
Тогда хреново, да

Дмитрий
16.07.2017
10:39:55
Переход от стримов с одним потоком к Futures на двух сопоставим собственно с самим переходом на стримы с обычных структур)
Ещё бы either выбрать нормальный, без него половины фич нет

Vadim
16.07.2017
10:40:42
Из какой либы ты используешь Future?

Дмитрий
16.07.2017
10:40:50
fluture

Google

Vadim
16.07.2017
10:41:21
И еще, есть ли какие-то полезные юз-кейсы использования именно IO вместо Future?

andretshurotshka?❄️кде
16.07.2017
10:42:56
Future для асинхронности

Vadim
16.07.2017
10:43:59
Как один из плюсов стримов на rxjs мне вспомнилось, что там можно задавать то, где именно будет проводиться ресурсоемкая операция - параллельно или последовательно (next tick).

Дмитрий
16.07.2017
10:47:00
В fluture есть параллельное выполнение

andretshurotshka?❄️кде
16.07.2017
10:47:34
лол
На fluture можно стрим кликов сделать?)

Дмитрий
16.07.2017
10:47:58

Vadim
16.07.2017
10:48:06

Дмитрий
16.07.2017
10:48:06

andretshurotshka?❄️кде
16.07.2017
10:48:20

Дмитрий
16.07.2017
10:48:25
Так же

Vadim
16.07.2017
10:48:46

Дмитрий
16.07.2017
10:51:06
как)
Там do нотация через генераторы

andretshurotshka?❄️кде
16.07.2017
10:51:59
Так же
Не, разве future может бесконечный стрим сделать?)

Дмитрий
16.07.2017
10:52:19
А стрим через бесконечный Future?
Блин, что за вопросы))

Vadim
16.07.2017
10:52:35

Google

Дмитрий
16.07.2017
10:52:42
О разном вообще
Во первых не в любом
Во вторых я вообще не понимаю, что вы мне сейчас пытаетесь предъявить
Смысл не в том, как кастится стрим и future

Vadim
16.07.2017
10:54:21
Ну ладно, я сперва покопаюсь в этих вещах, и только потом, если будут непонятки буду задавать тяжкие вопросы. Пока рано ) А то, может там будет все очевидно )

Дмитрий
16.07.2017
10:54:28
Смысл в том, что в них каждое событие, УЖЕ вызванное форком future или данными в стриме проходит через одну и ту же цепь обработчиков
const yourFutureForInfiniteCast = Future.of( 0 )
Теперь с этим фьючерсом абсолютно так же можно делать .map, chain, flatMap и всё то, что и со стримом
При каждом форке он будет вызываться заново, и каждый раз будет проходиться вся цепьб дальнейших преобразований — аналогия со стримом
Только если у тебя в стриме упала ошибка — то ты должен её поймать и непременно вернуть в основной поток

Admin
ERROR: S client not available

Дмитрий
16.07.2017
10:57:53
Ещё конечно попытавшись типизировать всё это нормально
В future ты можешь работать с ошибками отдельно. Представь, что у тебя сразу два стрима, между которыми можно удобно и наглядно перекидывать данные
Их вообще надо использовать втроём —
type BulletProof<L, R> = Stream<Future<Either<L, R>, never>>

andretshurotshka?❄️кде
16.07.2017
11:01:57
Лол
А зачем Either

Дмитрий
16.07.2017
11:03:01
Оч удобно

Vadim
16.07.2017
11:03:16

Дмитрий
16.07.2017
11:03:24
А если в каждом .chain можно часть событий вернуть в R, а часть — уронить?

Google

Дмитрий
16.07.2017
11:03:42
Это — описание бесконечной цепи асинхронных событий, которые никогда не упадут в reject мимо catch, потому что никогда не падают вообще
Неплохо, да?))

Vadim
16.07.2017
11:04:14
Прикольно! Надо будет покопаться обязательно! )

Дмитрий
16.07.2017
11:04:47
Мне нужен нормальный Either, срочно ? То, что выше — это только начало)

Vadim
16.07.2017
11:05:41
А в sanctuary плох?

Дмитрий
16.07.2017
11:07:11
Ну он жирный, ещё не хватало тащить его рантайм ? Но на его базе и построен fluture-js, так что это как-то решается
Короче — вот у вас есть событие (обычный промис), которое может упасть в catch или зарезолвиться. Вы прячете событие в .fold(Left, Right) — и получаете промис, который никогда не падает, а просто возвращает Either.Left
А так как у нас есть мап и по ошибкам тоже, .mapRej, мы эту *какую-то* ошибку маппим на свои данные
const wellTypedEvent =
futureEvent
.mapRej(
error => error instanceof Error
? error
: new CustomError('unexpected failure', error)
.fold(Left, Right)

Vadim
16.07.2017
11:12:10
А обычные в FRP-стримы ты заворачиваешь для того, что б использовать специфические плюшки FRP-библиотек?
Потому что иначе смысла в обычном стриме не видно

Дмитрий
16.07.2017
11:13:12
frp пока больше всего юзаю, потому что без Either всё тлен
Так да, мне кажется число стримов тогда прям радикально сократится

Vadim
16.07.2017
11:15:24
Каких возможностей Either в современных реализациях тебе нехватает?

Дмитрий
16.07.2017
11:18:22
Стабильности (пинок folktale)
Легковесности (пинок sanctuary)
Уверенности, что это не заброшенный модуль (пинок всем остальным)
Stack safe (вообще почти всем)

Vadim
16.07.2017
11:21:12
>> Стабильности (пинок folktale)
Local variables referenced from На чем она у них вылетает?

Дмитрий
16.07.2017
11:22:23
Она не вылетает, я вообще думаю, что оно больше всех ок, просто там Result (Either у них) в статусе experimental
А, ну и ещё дико парит что там инстансы — это Either.Ok и Either.Error.
Error блин, у меня flow с ума сходит ?
Круче только метод async в most-subject и string в parsimmon ?

Vadim
16.07.2017
11:24:46
Мне для половины библиотек обычно приходится тайпинги кастомизировать
Хотя бы чуть-чуть

andretshurotshka?❄️кде
16.07.2017
11:25:17
Сделали бы Err