
Nick
14.03.2018
14:55:50
val task: Stream[F, Unit] = for {
taskId <- Stream.eval[F, TaskId](api.azaza())
status <- scheduler.retry[F, StatusResponse](api.status(taskId),
3 seconds,
d => d.plus(3 seconds),
30, {
case NonFatal(ex) =>
logger.warn(s"Status ${ex.getMessage}")
true
})
_ <- Stream.eval[F, ResultResponse](api.result(taskId))
} yield {
println(status)
}
так вот, azaza возвращает F[_] (в данном случае IO]

Alexey
14.03.2018
14:56:53
when(api.status(any()).thenAnswer(_ => IO.pure(Status))

yaroslav
14.03.2018
14:57:03
а тебе стримы нужны ради ретраев?

Google

Nick
14.03.2018
14:57:27

Alexey
14.03.2018
14:57:40
Ну так ты каждый раз вернёшь новый IO

Nick
14.03.2018
14:57:44
и след thenReturn не сработает, потому что будет переиспользоваться IO
api.status вызовется 1 разик бро)

Alexey
14.03.2018
14:58:06
Ну дык thenAnswer?

Denis
14.03.2018
14:58:16

Alexey
14.03.2018
14:58:25

Nick
14.03.2018
14:58:38

Denis
14.03.2018
14:58:40
etry[F, StatusResponse](api.status(taskId), ...)
только один раз
потому что нет смысла несколько раз вызывать
так как никаких сайд эффектов нет

Alexey
14.03.2018
14:59:25
Тааак, а что он тогда ретрает?

Google

Denis
14.03.2018
15:00:06
выполнение
IO
IO[A] - описывает действия
выполнить действия по одному и тому же описанию можно сколько кгодно раз

Nick
14.03.2018
15:01:07
Денис молодец

Denis
14.03.2018
15:01:47
IO(println("1234")).flatMap(_ => IO(println("1234"))) это тоже самое что val a = IO(println("1234")); a.flatMap(_ => a)

Nick
14.03.2018
15:01:52
Понимает

Denis
14.03.2018
15:01:53
чего нельзя сказать про Future
scheduler.retry какие ограничения на F[_] накладывает?

Nick
14.03.2018
15:04:56

Alexey
14.03.2018
15:04:59
Ясн, я подумал, что IO одноразовые

Nick
14.03.2018
15:05:39
Ну зачем ты так

Oleg
14.03.2018
15:06:26

Denis
14.03.2018
15:06:41
какое ты хочешь поведение от api.status? у тебя же IO в руках, значит можно что угодно сделать

Alexey
14.03.2018
15:07:55

Oleg
14.03.2018
15:08:00
т.к. одноразовость явно противоречит referential transparency

Nick
14.03.2018
15:10:19

Denis
14.03.2018
15:11:30
ну ты можешь тупо сделать через AtomicInt какой нибудь

Nick
14.03.2018
15:12:03

Denis
14.03.2018
15:12:55
def foo: IO[A] = {
val i = AtomicInt(0)
IO.defer {
if (i.incrementAndGet < 3) IO.raiseError(lol)
else IO(a)
}
}

Google

Denis
14.03.2018
15:13:17
хочешь прям совсем красиво прикрути MVar

Oleg
14.03.2018
15:13:33
а в скалаз будет IORef кекек

Denis
14.03.2018
15:13:37
но как бы тебе нужен IO с памятю вне этого IO

Nick
14.03.2018
15:26:21
на самм деле я думаю, можно замокать runAsync
но .when(io.runAsync(any[Either[Throwable,StatusResponse]=>IO[Unit]]())) не работает)
@eld0727 предложи вариант лучше)

Alexey
14.03.2018
15:29:27

Denis
14.03.2018
15:29:48

Nick
14.03.2018
15:29:48
ну блин, мой перфекционизм все портит)

Denis
14.03.2018
15:30:07
какой перфекционизм если ты юзаешь мокито

Alexey
14.03.2018
15:30:11
Ты хочешь стейт без стейта

Nick
14.03.2018
15:30:34

Oleg
14.03.2018
15:30:36

Denis
14.03.2018
15:30:53
IO :)

Nick
14.03.2018
15:30:57

Alexey
14.03.2018
15:32:12
Ну ты всё равно же будешь где то хранить, что ты сделал N вызовов

Nick
14.03.2018
15:32:20
не я, а мокито
сам ж сказал что thenReturn можно несколько раз юзать)

Google

Denis
14.03.2018
15:33:10
I'm outta here

Nick
14.03.2018
15:38:32

Р
14.03.2018
16:50:31
Мне кажется или в Scala 2.12 вывод типа параметра у анонимной функции стал работать лучше?
Типа теперь во многих местах вместо object.method { parameter: Type => ... } можно писать просто object.method { parameter => ... }

Oleg
14.03.2018
16:54:45

Mikhail
14.03.2018
17:02:16

Admin
ERROR: S client not available

Alexander
14.03.2018
18:25:20

Viacheslav
14.03.2018
19:59:22
Пацаны ваще финчята! Подскажите плиз, как подружить скалячью или твитерячью фьчу с финч эндпоинтом? Код
val executeJob: Endpoint[JobId] = post("executeJob" :: jsonBody[AppParams]) { params: AppParams =>
val result: Future[JobId] = ...
чо делать с result? Как Ok послать?
}

Daniel
14.03.2018
20:06:40

Viacheslav
14.03.2018
20:07:29
я конвертнул
теперь мне надо Ok вернуть
у меня есть Ок у меня есть фьюча с результатом

Daniel
14.03.2018
20:08:01
там же есть пример, возвращай
val e = get("foo") { Future.successful(Ok("bar")) }

Viacheslav
14.03.2018
20:10:21
то есть я могу сделать так?
val executeJob: Endpoint[JobId] = post("executeJob" :: jsonBody[AppParams]) { params: AppParams =>
val result: Future[JobId] = ...
result.map(Ok("беззаговорочный успех"))
}

Daniel
14.03.2018
20:10:44
да

Viacheslav
14.03.2018
20:10:48
спрашивается зачем спрашивать когда можно проверить)
вобщем спасиб)

Daniel
14.03.2018
20:10:54
just do it

Viacheslav
14.03.2018
20:11:58
просто из сигнатуры метода нифига не понятно что эндпоинт умеет работать с фьючами и это заставляет копаться в документации

Google

Daniel
14.03.2018
20:12:57
запили правки в доку)
там только рады будут
2.5 мейнтейнера

Andrey
15.03.2018
05:52:48
А что,
{implicit param: SomeType => foo()}
foo(...)(implicit param: SomeType ) = ...
implicit параметр в теле функции подхватывается как implicit val?

Юрий
15.03.2018
05:58:40
оформи код как код, непонятно ничего

Oleg
15.03.2018
06:00:55
Но как stable reference, как минимум
в этом же их и суть, имплиситов этих - получил, попользовался - передай другому внутрь

Andrey
15.03.2018
06:05:12
А если параметорм будет функция, скала сделает преобразование типов при необходимости?

Oleg
15.03.2018
06:06:32
хвала небесам, это намереваются выпилить

Alexei
15.03.2018
06:10:11

Юрий
15.03.2018
06:13:04

Alexey
15.03.2018
06:16:24
Вот интересно, а лайтбендовский мониторинг насколько просаживает производительность ?

Daniel
15.03.2018
06:26:41

Alexei
15.03.2018
06:29:43
А зачем вы агент использовали?
Думали по-быстрому заиметь метрики внутренностей Акки для перформанс-тестирования и получили совсем ужасные результаты. В итоге понаписывали собственных велосипедов на базе Scala Metrics / Dropwizard - где-то напрямую в коде, где-то через наследование и aroundReceive()

Юрий
15.03.2018
06:36:12

Александр
15.03.2018
06:36:36

Юрий
15.03.2018
06:46:33
Народ, а вот насчет камона. В дропвизарде можно метрики строить иерархично - делаешь Registry и вкладываешь друг в друга. И имя метрики строится также иерархично. В камоне я чёт такого не вижу. Там так можно? Или все метрики там идут как top level?