
kana
15.02.2018
23:33:48
горю от того, что не могу понять, какая же правильная сигнатура у редьюсеров редакса
(S, A) => S
или
(S | undefined, A) => S
с начальным состоянием
таки попробую сделать в виде классов

Дмитрий
15.02.2018
23:35:15
Это прикол контравариантного значения

Google

Дмитрий
15.02.2018
23:39:51
reducer: (state: S, data: A) => S | void
При получении стейта его тип должен быть как минимум S, при передаче — как максимум, то есть для того кто отправляет значение в редьюсер ограничения мягче

kana
15.02.2018
23:41:10
хм, может таки наоборот, как изначально было?
редьюсер всегда отдает стейт, но может не принимать, чтобы установить начальное значение
на вход как максимум S, на выход как минимум

Дмитрий
15.02.2018
23:41:58

kana
15.02.2018
23:42:42
и в этой сигнатуре она может отдать на вход void (раз выход идет на вход), и при этом не может (так как вход принимает строго S)

Denis
15.02.2018
23:44:26
Maybe S и вот вам и все)

Дмитрий
15.02.2018
23:44:46
Не не, тут как раз та ситуация где maybe не катит, тут о другом вопрос

kana
15.02.2018
23:44:56
для чего мне это нужно - мне не нравится подход redux-act, я давно хочу довести до ума создание редьюсеров через трансдьюсеры
собственно я это уже сделал, но мне не понравилось

Denis
15.02.2018
23:45:48

kana
15.02.2018
23:46:27
https://gist.github.com/kana-sama/b277e630b145ef9d9adbc03a1cb6cc8c

Denis
15.02.2018
23:46:59
https://github.com/tigercosmos/date2json/blob/master/index.js :D

Google

kana
15.02.2018
23:47:58

Дмитрий
15.02.2018
23:48:04

kana
15.02.2018
23:48:30
да, я понял прекрасно
в редьюсер можно отдавать undefined, я вот к чему
а вернуть undefined он не может

Denis
15.02.2018
23:49:05
ну блин) прочитайте про join patterns и поймете что весь этот редакс фикция и от недостатка ума

kana
15.02.2018
23:49:12
поэтому на вход как максимум стейт (или больше, вход в принципе вообще не ограничен), как минимум андефайнед
на выход как минимум стейт

Kelin
15.02.2018
23:50:04
Ох уж этот редакс
Придумали люди себе проблемы ни с чего, а теперь страдают
?

kana
15.02.2018
23:51:31
ну вообще да, она примитивна же

Дмитрий
15.02.2018
23:52:22
Как максимум на вход означает, что у нас может быть void на входе и это типа безопасно. Но у нас по определению же на входе не void! То есть при взгляде изнутри редьюсера ситуация ровным счётом противоположная — мы полностью уверены что то, что на входе — соответствует сигнатуре

Denis
15.02.2018
23:52:57
а ты скинь нормальный читаемый материал
https://en.wikipedia.org/wiki/Join-pattern
https://baconjs.github.io/api2.html#join-patterns
http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html#AndThenWhen
https://github.com/xgrommx/most-reactive-flux/blob/master/app/src/utils.js#L8-L17
https://github.com/xgrommx/react-rx-flux/blob/master/src/rx-extensions.js#L37-L49

kana
15.02.2018
23:53:05
редьюсер может ничего не получить на вход и подставить начальное значение
это удобство, которое мне рушит типизацию

Denis
15.02.2018
23:54:17

Google

kana
15.02.2018
23:54:42
так
ты под join patterns понимаешь обычный аппликативный lift?
собственно в редаксе все это есть
для селекторов

Denis
15.02.2018
23:56:32

Дмитрий
15.02.2018
23:56:39
редьюсер может ничего не получить на вход и подставить начальное значение
Вот. А теперь следи за руками — допустим, у нас уже есть редьюсер, который берёт на себя эти обязательства (подставить дефлот в аргумент) и обеспечивает нужные по условию гарантии (возвращает по определению корректный тип)
Тогда все редьюсеры, которые можно вложить в него, становятся обладателями контракта с кучей прав и отсутствием обязанностей)

kana
15.02.2018
23:57:53

Дмитрий
15.02.2018
23:58:15
Он не внешний, он внутренний ?

kana
15.02.2018
23:58:28
это зависит
в моем кейсе он одновременно и такой, и такой)

Дмитрий
15.02.2018
23:58:54
Бивариантность, да ?

kana
15.02.2018
23:59:44
а именно, изначально он внутренний, все редьюсеры СРАЗУ вызывают следующий, пока не дойдем до него, он отдает уже ГАРАНТИРОВАННЫЙ стейт, и мы поднимаемся по стеку обратно наверх, гарантированно имея стейт и отдавая стейт


Дмитрий
16.02.2018
00:00:22
Я к тому, что я могу воспользоваться шансом и вывернуть апи на изнанку, ввиду чего внешний редьюсер скроется внутри кода, а внутренние станут публично доступными фичами
И я кстати был шокирован, насколько недалеко от сюда до join patterns, там буквально ещё несколько таких финтов с выходом за рамки достаточно для эффективной имплементации
а именно, изначально он внутренний, все редьюсеры СРАЗУ вызывают следующий, пока не дойдем до него, он отдает уже ГАРАНТИРОВАННЫЙ стейт, и мы поднимаемся по стеку обратно наверх, гарантированно имея стейт и отдавая стейт
value propagation, да. Source, Sink, источников мало, истоков много, при эммите новых данных значение всплывает к каждому стоку для данных
Редакс находится в довольно занятном положении — будучи достаточно простым чтобы умещаться в один твит и заслужить хейт зиги, он как-то ловко балансирует на границе за которой начинается реально суровый CS) Причём начинается неожиданно резко)


kana
16.02.2018
00:21:00
мне надоело, что в flow нет универсальной квантификации
ок:
forall a. a -> a
const x: <T>(x: T) => T
не ок:
type F<T> = (x: T) => T;
const x: F<T>
- ошибка, откуда взялся T
причем сделать <T>(x: T) в F нельзя, T потом нужно связывать с другими значениями

Дмитрий
16.02.2018
00:22:53
F<T> = T => T
Для любого T есть один и только один тип T => T, такой, что
F = <T>T => T
Существует такая функция, что для любого T

kana
16.02.2018
00:23:26
ну вот я и хочу
x: forall T. F<T>, что изоморфно первому

Google

kana
16.02.2018
00:23:30
а в флоу так нельзя
и нужно писать <T>() => F<T>

Дмитрий
16.02.2018
00:23:45
???
?
type Tagged<Tag> = any
type Str = Tagged<string>
type Num = Tagged<number>
Это вариант через фантомы, можно как то выкрутиться. Но forall конечно по прежнему нет ?
Плюс existential type

andretshurotshka?❄️кде
16.02.2018
00:43:42
опять монады

Roman
16.02.2018
00:45:22
/pidor@SublimeBot

Sublime Bot
16.02.2018
00:45:22
Я нашел пидора дня, но похоже, что он вышел из этого чата (вот пидор!), так что попробуйте еще раз!

Roman
16.02.2018
00:45:27
/pidor@SublimeBot

Sublime Bot
16.02.2018
00:45:27
Сейчас поколдуем...
Военный спутник запущен, коды доступа внутри...
Высокий приоритет мобильному юниту.
Кто бы мог подумать, но пидор дня - ilia

andretshurotshka?❄️кде
16.02.2018
00:45:40
/shipper@shippering_bot

SHIPPERING
16.02.2018
00:45:40
Никто этого не ожидал
Даже подумать никто не мог
Что эти ребята отношаются
Вы посмотрите на них: @justnoxx + @nevmmv = ♥

Google

andretshurotshka?❄️кде
16.02.2018
00:46:03
так не работает

kana
16.02.2018
00:47:49
еще во флоу нельзя делать дефолтные значения для генериков функций

andretshurotshka?❄️кде
16.02.2018
00:47:56
можно же?

kana
16.02.2018
00:48:32
в тс можно, в flow ругается на знак равно
может пора спать

Дмитрий
16.02.2018
00:50:13
Я уже спал на этой неделе

Roman
16.02.2018
00:50:31

Дмитрий
16.02.2018
00:51:30
От пидора дня до applicative join patterns и обратно ?♂️

andretshurotshka?❄️кде
16.02.2018
00:51:59
/pidorstats@SublimeBot

Sublime Bot
16.02.2018
00:52:01
Топ-10 пидоров за текущий год:
1. Dmitry_Kovbasa — 2 раз(а)
2. Ilia — 2 раз(а)
3. defaultvoice — 1 раз(а)
4. Adsumus — 1 раз(а)
5. jqueryisamonad — 1 раз(а)
6. kelin2025 — 1 раз(а)
7. goodmind — 1 раз(а)
8. tetris0k — 1 раз(а)
9. vlastachu — 1 раз(а)
10. reeei — 1 раз(а)
Всего участников — 20

Denis
16.02.2018
00:52:15
записки психа
обзервабл это правое расширение кана
import Data.Functor.Kan.Ran
newtype ConstT r f a = ConstT { runConstT :: f r }
newtype ContT' r m a = ContT' { runContT' :: Ran (ConstT r m) (ConstT r m) a }
type Observer a = a -> IO ()
type Observable a = ContT' () IO a
makeObservable :: (Observer a -> IO ()) -> Observable a
makeObservable f = ContT' $ Ran $ \k -> ConstT (f (runConstT . k))
subscribe :: Observable a -> Observer a -> IO ()
subscribe r f = runConstT (runRan (runContT' r) (ConstT . f))
obs = makeObservable $ \observer ->
do observer 1
observer 2
main :: IO ()
main = subscribe obs print

andretshurotshka?❄️кде
16.02.2018
00:52:41
а левое?

Denis
16.02.2018
00:52:53
я еще не познал его)

Дмитрий
16.02.2018
00:53:33
ПРАВОЕ РАСШИРЕНИЕ 0/ 0/ 0/ КАНА

andretshurotshka?❄️кде
16.02.2018
00:53:47
кана?

Denis
16.02.2018
00:54:05
Кана