
? animufag ?
09.08.2017
23:21:24
так то в джс можно сделать concat для списков который будет складывать списки ну и как будто сделал инстанс

Дмитрий
09.08.2017
23:26:28

andretshurotshka?❄️кде
10.08.2017
06:54:42
https://github.com/Termina1/tlhydra/tree/rewrite

Denis
10.08.2017
09:41:22

Google

Gleb
10.08.2017
09:44:18
Привет есть ли возмжность по изящней тестировать rx код чем вырвиглазные marbles тесты
Тем более как вообще можно изобразить с их помощью например retryWhen
Поделитесь кто как тестирует rx код пожалуйста

Denis
10.08.2017
09:46:47
вот тут Саша написал как-то http://www.mostovenko.com/posts/2016-05-21-testing-with-rxjs.html

Gleb
10.08.2017
09:46:57
Нукась
А ну да вот эта статья попадался но тогда получается весь код надо дробить на очень маленькие функции а не цепочки из чейнов
https://mikebridge.github.io/articles/typescript-redux-observable-epic-test/
Вот в целом пока самый подходящий

Evgeny
10.08.2017
12:30:21
Господа, нужен совет. Есть жсный проект в умеренно функциональном стиле. То есть что-то в таком духе:
// :: String -> String -> SomeThing -> Maybe Stuff
const foo = curry((x, y, z) => ...)
// :: String -> Stuff -> Maybe OtherStuff
const bar = curry((x, y) => ...)
// :: SomeThing -> Maybe OtherStuff
const baz = compose(
chain(bar('something')),
foo('blah', 'blah')
)
ramda, point-free стиль в меру, несложные монадки.
И есть желание всё это дело затипизировать по-человечески на flow либо ts
Собственно, вопрос: какие функциональные либы лучше всего дружат с flow или ts?

illiatshurotshka❄️
10.08.2017
12:31:25
есть тайпинги для рамды
в тс

Evgeny
10.08.2017
12:33:45
то есть оно даже какой-нибудь assocPath без проблем переварит?
Я в этом плане несколько отстал от жизни, когда в последний раз смотрел, всё было не очень
Тут, кажется, недавно хвалили https://github.com/hallettj/safety-lens и ещё что-то

Google

Denis
10.08.2017
12:37:13

Evgeny
10.08.2017
12:39:14

Denis
10.08.2017
12:47:15
https://gist.github.com/developit/7a6e48654b88002a835f8f6bc4535a6d#gistcomment-1902744
https://github.com/gcanti/fp-ts-fluture

Evgeny
10.08.2017
13:10:00
Спасибо, буду смотреть

Gleb
10.08.2017
13:54:48
Как правильно протестировать данный кусок кода подскажите пожалуйста
action$
.ofType(types.AUTH_LOG_IN)
.take(1)
.flatMap(() => Observable
.interval(token.accessTokenExpiredTime())
.flatMap(() => token.refreshToken(token.getRefreshToken))
.mapTo({
type: REFRESH_TOKEN_UPDATED
})
);
Это ведь по факту бесконечно

Denis
10.08.2017
14:04:37
flatMap замени на mergeMapTo и тогда лямбды не будет ни у mapTo то же не надо, можно тогда resultSelector у mergeMap взять

Gleb
10.08.2017
14:04:59
Точняякк
Спасибо!

Denis
10.08.2017
14:05:31
у mergeMapTo тоже есть селектор
mergeMapTo(Observable.interval(token.accessTokenExpiredTime()).mergeMapTo(token.refreshToken(token.getRefreshToken)), (_, _) => ({type: REFRESH_TOKEN_UPDATED}))) как-то так
хотя даже можно как-то убрать все эти mergeMap через mergeScan

Gleb
10.08.2017
14:10:03
Большое спасибо!

Evgeny
10.08.2017
14:33:26
А кто-нибудь имел дело с https://github.com/gcanti/flow-static-land?

Gleb
10.08.2017
14:53:59
А можно ли как нибудь retryWhen заставлять предыдущий оператор выполнять но с изменениями

Denis
10.08.2017
14:54:35

Gleb
10.08.2017
14:54:47
action$
.ofType(types.HTTP_REQUEST)
.map((action: HttpRequestAction) => action.payload)
.mergeMap(({
request,
actionTypes,
key,
args,
injectLoader
}) =>
fetchApi(request)
.mergeMap((response: AjaxResponse) => [
...
])
.takeUntil(action$.ofType(actionTypes.CANCEL))
.retryWhen(tokenExpired)
.catch((error: AjaxError) => [
...
])
);
В частности вот тут tokenExpired сделает запрос и получит токен, хочется запроса уже делать с новым токеном
Ну то есть retryWhen повторит fetchApi(request) с теми же хедерами что и до tokenExpired которая обновит токен
А хотелось бы с токеном ее вызывать уже сполученным

Denis
10.08.2017
14:55:53
tokenExpired что тут?

Google

Gleb
10.08.2017
14:56:19
export const tokenExpired = err$ =>
err$
.switchMap((e: AjaxError) => {
if (e.status === 401 && token.tokensExpired()) {
return Observable.fromPromise(token.refreshToken());
}
throw e
})
.take(3);
token.refreshToken() обычный fetch который положит в сторедж токен
fetchApi ходит в стредж перед запросом, но при retryWhen он уже передан старый

Denis
10.08.2017
14:58:10
ну сделай чтобы эта дрянь перезапускалась через какой-нибудь Observable.defer(() => tokenExpired) но я бы нахер выкинул это говно под названием fetch если у меня есть Observable.ajax

Gleb
10.08.2017
14:58:53
Хорошо предположим я выкину гавно fetch, так я смогу серджить себе токен?
fetchApi(request) - это Observable.ajax, только конфигуриреумый данными из action

Denis
10.08.2017
15:00:23
ну можешь сделать через defer тогда каждый раз будет перезапускаться Observable
типа из hot -> warm

andretshurotshka?❄️кде
11.08.2017
23:26:32
?
255 members
int overflow

Sklyarov
13.08.2017
21:00:47

illiatshurotshka❄️
13.08.2017
21:03:14
зачем суффиксовать долларом?

kana
13.08.2017
21:03:43
Конвеншн, чтобы сразу видеть, что стрим а что нет, аналогично как предикаты часто заканчивают знаком вопроса, а функции с эффектом бэнгом

Дмитрий
13.08.2017
21:11:21
Я привык обозначать стримы в типе, а не в имени ?

Vadim
14.08.2017
18:04:25

Сергей
14.08.2017
18:05:41

Vadim
14.08.2017
18:09:06
Первый раз слышу про такую конвенцию.

Сергей
14.08.2017
18:09:11

Vadim
14.08.2017
18:09:16
тогда ок

Google

Сергей
14.08.2017
18:09:22
active? vs isActive()

Denis
14.08.2017
18:09:26
где такая ебанина про !?

Сергей
14.08.2017
18:09:39
update! vs updateAndSave()

Denis
14.08.2017
18:09:54
а руби, язык всплош пронизан хуйней и сайдэффектами

Сергей
14.08.2017
18:09:59

illiatshurotshka❄️
14.08.2017
18:10:09
в руби ! для мутации

Admin
ERROR: S client not available

Сергей
14.08.2017
18:10:13
но ! ? очень круто

illiatshurotshka❄️
14.08.2017
18:10:13
только для нее

Сергей
14.08.2017
18:10:27

Denis
14.08.2017
18:10:28
из динамики только питончик достоен уважения

Сергей
14.08.2017
18:10:38

illiatshurotshka❄️
14.08.2017
18:10:39

Сергей
14.08.2017
18:10:45

illiatshurotshka❄️
14.08.2017
18:10:58
str = str.strip == str.strip!

Сергей
14.08.2017
18:11:40
str = str.strip == str.strip!
я как-то просматривал стандартную библиотеку
и несколько раз натыкался на методы без бэнга
но мутирующие исходные данные
посмотри
убедишься

illiatshurotshka❄️
14.08.2017
18:12:02
если нет не мутирующего эквивалента

Google

Denis
14.08.2017
18:12:23
рористы не программисты))

illiatshurotshka❄️
14.08.2017
18:12:37
methods only have bangs where a safer alternative exists in the core lib
намного лучше чем на питоне/баше

? animufag ?
14.08.2017
18:13:59
safer alternative это как strong typing
баш чему угодно проигрывает. питона обычно хватает
не думаю что есть вещи где руби/питон сильно между собой выигрывают

illiatshurotshka❄️
14.08.2017
18:16:28
на руби быстрее писать

? animufag ?
14.08.2017
18:16:36
спорно

illiatshurotshka❄️
14.08.2017
18:16:38
ага

? animufag ?
14.08.2017
18:17:09
я могу сказать, что на питоне я не пишу бегин/энд. вроде бы так быстрее

andretshurotshka?❄️кде
14.08.2017
18:19:04
лол

? animufag ?
14.08.2017
18:19:55
помню пару раз у меня была задача сделать штуку которая бы общалась с cli (читала, stdout, кидала stdin) и в обще это было сложновато на питоне
думаю на руби также

kana
14.08.2017
18:21:42
У него этл часто, он же хаскель-фашист
очередное необоснованное мнение
А вообще я это из лиспов взял, а точней из кложи
Особенно нравится ?, не нужно постоянно думать о глаголе, времени, числе предиката