
Alexander
21.09.2017
18:36:50
Ну или я не привык ещё.

Oleg
21.09.2017
18:40:09
и в ключевых точках ты можешь явно их преобразовывать
и в некоторых отдельных точках ты можешь что-то вывести из этого типа

Google

Oleg
21.09.2017
18:42:05
Например, статускоды и типы для сваггера, отличающиеся от 200

Pavel
21.09.2017
18:43:46
окей, но так же можно сделать по типу эксепшены в условном error handler. Но еще вопрос же в другом, если тебе в одном методе в for нужно заюзать два метода с разными ошибками - их нужно будет приводить или к верхнему тему или вставлять обработчик (если не хочешь приводить к верхнему типу)
если приводим к верхнему типу то мы тогда теряем конкретные типы ошибки - что получается - смысл тогда от either
если постоянно обрабатывать - тут получается вопрос удобства возникает
один раз окей, а если несколько

Oleg
21.09.2017
18:46:28
ты почему-то заранее представил ровно один способ работать с ошибками в типах - и это иерархия типов и EitherT
На самом деле, я говорю о другом коде, там нет приведения к верхнему типу и нет EitherT

Pavel
21.09.2017
18:48:29
мне тогда нужен пример - ровно один способ это тот о котором все пишут в статьях когда я гуглю future either
поэтому у меня и возник вопрос - все пишут, а кто его юзает

Oleg
21.09.2017
18:49:39
Тогда подними этот ток завтра, а то я сливаюсь сейча

Pavel
21.09.2017
18:50:08
окей

Igor
21.09.2017
18:56:18
есть какие-нибудь варианты вставить элемент в лист в нужное место красивее этого?
def insertForkToList(tree: CodeTree, list: List[CodeTree]): List[CodeTree] = {
def f(ct: CodeTree) = {some filter}
(list.filter(f) :+ tree) ::: list.filterNot(f)
}

Bulat
21.09.2017
19:00:52
list.partition(f) match {
case (left, right) => left :: tree :: right
}

Google

Bulat
21.09.2017
19:01:06
не знаю насколько это "красивее")
можно так
val (left, right) = list.partition(f)
left :: tree :: right

Cyrillos
21.09.2017
19:05:46
Парни, а где java 9 то? Сегодня же релиз, не?
Интернеты молчат

Ilya
21.09.2017
19:09:34
http://www.java9countdown.xyz/
здесь салют

Nikolay
21.09.2017
19:16:42
что, теперь правда можно val list = new ArrayList<String>(); ?

Cyrillos
21.09.2017
19:16:56

Pavel
21.09.2017
19:17:06
джава днище

Igor
21.09.2017
19:18:06

Cyrillos
21.09.2017
19:18:15

Kirill
21.09.2017
19:36:58
а что, с девяткой скала норм, модули не мешают?

Alexander
21.09.2017
19:49:51

Nikolay
21.09.2017
19:52:34
Вроде есть

Cyrillos
21.09.2017
19:52:58
ага, вот только в этом часе появилась
я уже поставил, пробую)

Nikolay
21.09.2017
20:34:01
а у yourkit раньше была personal license. теперь нет? https://www.yourkit.com/purchase/

Cirno
21.09.2017
20:35:15
Только 64 бит, хех.

Google

Cirno
21.09.2017
20:36:01

Nick
21.09.2017
20:47:06
А докер имедж на Алпаине будет?)
Вообще конечно зря 32 битную не оставили

Nikolay
21.09.2017
21:02:22
по akka streams есть вопрос. может быть кто сталкивался - поделитель опытом. есть flow, который состоит из множества этапов. каждый этап может вернуть либо ошибку(но не кинуть исключение), либо результат. если один из этапов вернул ошибку - остальные этапы не нужно выполнять. все элементы должны дойти до конца flow. текущее решение - каждый этап Flow возвращает Either[MyError, Result]. на каждом этапе проверяем, если это Left - просто пробрасываем в следующий этап, никак не обрабатывая. В конечном счете становится несколько муторно, но в принципе терпимо. есть вариант описать через GraphDSL, где ошибки будут сразу кидаться в конец графа, минуя все этапы.
какие еще есть варианты, что реализовали может?


Oleg
21.09.2017
21:18:20
по akka streams есть вопрос. может быть кто сталкивался - поделитель опытом. есть flow, который состоит из множества этапов. каждый этап может вернуть либо ошибку(но не кинуть исключение), либо результат. если один из этапов вернул ошибку - остальные этапы не нужно выполнять. все элементы должны дойти до конца flow. текущее решение - каждый этап Flow возвращает Either[MyError, Result]. на каждом этапе проверяем, если это Left - просто пробрасываем в следующий этап, никак не обрабатывая. В конечном счете становится несколько муторно, но в принципе терпимо. есть вариант описать через GraphDSL, где ошибки будут сразу кидаться в конец графа, минуя все этапы.
решал двумя способами, первый способ - был такой же
комбинировал с помощью операторов, вдохновлённых
https://hackage.haskell.org/package/base-4.10.0.0/docs/Control-Arrow.html#t:ArrowChoice
на коты, к несчастью, не могу дать ссылку, у них Choice бедноватый
Но в общем суть в том, что простыми операторами
Flow[A, B] или Flow[A, Either[E, B]] становятся
Flow[Either[E, A], Either[E, B]], который уже встроенными способами композится
Второй вариант - написать собственных композеров для
FanOutShape2, внутри которых merge
Первый больше понравился


Nikolay
21.09.2017
21:22:54

Oleg
21.09.2017
21:24:22

Alexander
22.09.2017
00:16:08
Господи, ну и мерзость.
Бота нельзя суммонить?

Aleksei
22.09.2017
03:24:17
Бот не просек

Oleg
22.09.2017
05:00:31
пропустил

Daniel
22.09.2017
08:34:54
это гуманная стратегия сработала
он игнорит тех кто оказался в чате до его прихода

Oleg
22.09.2017
08:54:39
так что там было то?

Daniel
22.09.2017
08:57:20
спам для бородачей
и фоточка бороды в виде хелицер

folex
22.09.2017
09:22:28
У меня тут странное в sbt. В некоторых подпроектах добавление .settings(Defaults.coreDefaultSettings) выдает ошибку при запуске сбт:
[error] References to undefined settings:
[error] {.}/*:thisProjectRef from {.}/*:onLoadMessage ((sbt.Defaults) Defaults.scala:178)
[error] Did you mean subproject1/*:thisProjectRef ?
[error] {.}/*:thisProject from {.}/*:baseDirectory ((sbt.Defaults) Defaults.scala:1062)
[error] Did you mean subproject2/*:thisProject ?
[error] {.}/*:thisProject from {.}/*:name ((sbt.Defaults) Defaults.scala:176)
[error] Did you mean subproject2/*:thisProject ?
подпроекты вроде бы точно такие же как остальные, но падает только в этих двух

Google

folex
22.09.2017
09:25:30
непонятно даже в какую сторону копать. Я так понимаю проблема в том что
> thisProject: Provides the Project associated with this scope (undefined at the global and build levels)
> thisProjectRef: Provides the ProjectRef for the context (undefined at the global and build levels)
но каким образом я мог поменять скоуп на global - непонятно
И еще странное поведение:
inThisBuild(test in assembly := {}) не работает. А вот если руками в каждый сабпроект проставить это, то работает. При этом я никак сверху не накатываю нигде настроек ассембли дополнительных.
Может быть так что autoplugin перетирает inThisBuild настройки?


Михаил
22.09.2017
10:02:55
решал двумя способами, первый способ - был такой же
комбинировал с помощью операторов, вдохновлённых
https://hackage.haskell.org/package/base-4.10.0.0/docs/Control-Arrow.html#t:ArrowChoice
на коты, к несчастью, не могу дать ссылку, у них Choice бедноватый
Но в общем суть в том, что простыми операторами
Flow[A, B] или Flow[A, Either[E, B]] становятся
Flow[Either[E, A], Either[E, B]], который уже встроенными способами композится
Можно посмотреть пример реализации первого способа? Там всё равно внутри флоу происходит проверка, левое или правое значение получено?

Pavel
22.09.2017
10:46:01
@odomontois так это, че там по поводу Future[Either]?

Oleg
22.09.2017
10:46:52
Щащащащаща
Вечерком

Mikhail
22.09.2017
10:49:07
EitherT облегчает жизнь, да


Alexey
22.09.2017
10:49:47
по akka streams есть вопрос. может быть кто сталкивался - поделитель опытом. есть flow, который состоит из множества этапов. каждый этап может вернуть либо ошибку(но не кинуть исключение), либо результат. если один из этапов вернул ошибку - остальные этапы не нужно выполнять. все элементы должны дойти до конца flow. текущее решение - каждый этап Flow возвращает Either[MyError, Result]. на каждом этапе проверяем, если это Left - просто пробрасываем в следующий этап, никак не обрабатывая. В конечном счете становится несколько муторно, но в принципе терпимо. есть вариант описать через GraphDSL, где ошибки будут сразу кидаться в конец графа, минуя все этапы.
да, только так. третьего способа мне не известно. первый или второй сильно зависит от домена. можно сделать свой маленький EitherFlow[T], который будет скрывать всю сложность. можно все в рукопашную, что тоже ок

Mikhail
22.09.2017
10:50:53

Pavel
22.09.2017
10:52:20
тогда вопрос) Есть трейт Error и от от него два вида еррора. Потом у тебя есть метод который делаешь for и там вызывается два других метода - Future[Either[ErrorA, String]] и Future[Either[ErrorB, String]], когда ты делаешь flatMap с EitherT они у тебя подведутся к общему типу Error - ну и как тут видно какая именно ошибка там?
это тоже самое что хэндлить эксепшен общий


Oleg
22.09.2017
10:53:27
@odomontois так это, че там по поводу Future[Either]?
В общем, куски кода позже.
Но идея такая. У тебя есть своя кастомная монадка, не какое-то говнонаслоение Eff или трансформеров, а совсем свой тир со сложным типом ошибки. Это не надтип всех ошибок, но из разнообразных ошибок в него есть морфизмы
Ты для каждого локального типа ошибки объявляешь FunctorRaise ( по новому котовьему словарю)
А в сервисах требуешь один какой-то конкретный
Идея в том, что ты можешь добавить какие-то новые ошибки легко, от некоторых тебе может ничего и не надо кроме текста. Некоторые превратятся в свой собственный подтип sealed trait, чтобы потом можно было заматчить на статускод
Но твоя эта суперошибка - это не свалка всего, она описывает все способы обработать ошибку в итоге и информацию, которая для этого тебе понадобится


Pavel
22.09.2017
10:58:32
окей, возможно когда речь идет о своей монаде, и возможно она еще неплохо абстрагирована от внешнего мира - то наверное имеет смысл там делать свои ошибки
но это я так понимаю речь не о Future[Either]
а о M[Either]

Google

Oleg
22.09.2017
10:59:34

Pavel
22.09.2017
11:01:55
тут речь на самом деле о Future, о том классе который и так уже хендлит исключительные ситуации и позволяет обрабатывать их отдельно

Oleg
22.09.2017
11:02:07
Речь идёт о чём-то типа
final case class MyApp[+A]( Context => Task[Either[MyError, MySpecialResult[A]]])

Pavel
22.09.2017
11:03:28
окей, и ты предлагаешь в MyError пихать ошибки связанные с каким-то допустим условиями валидации или чет такого что влияет только на MySpecialResult
допустим где все зависит от исходных параметров
давай допустим поговорим о доступе к базе где могут кидаться ошибки мол констрейт нарушен или допустим нету конекшена в базу

Oleg
22.09.2017
11:04:12

Pavel
22.09.2017
11:04:31
окей, то есть Future.failed все равно нужно обрабатывать
а что тогда мешает добавить свою эксепшен и захендлить его в рековери

Oleg
22.09.2017
11:04:51

Daniel
22.09.2017
11:05:07

Oleg
22.09.2017
11:05:42

Pavel
22.09.2017
11:06:41
окей, то получается при вызове метода который возвращает Future[Either[A, B]] ты должен убедится что он раскроется в Future[B] , то есть ошибка будет обработана

Mikhail
22.09.2017
11:07:17

Pavel
22.09.2017
11:07:29
как правило такие штуки решаются через getOrElse - но таких случаев не много. Если юзер ввел неправильные данные - тебе полюбому нужно кинуть ошибку

Oleg
22.09.2017
11:07:30
Поэтому вполне возможно, что для некоторых ошибок ты возьмёшь и напишешь такой FunctorRaise, который будет просто возвращать Task.fail
Для некоторых не менее просто raise(MiscError(failText))

Pavel
22.09.2017
11:09:12
блин, но мне сложно все равно увидеть приемущество от этого механизма если тоже самое делается через throw во фьюче