
Oleg
22.05.2018
18:25:58
т.к. set возвращает просто S => S у мономорфной призмы

Nick
22.05.2018
18:26:31

Eugene
22.05.2018
18:28:17
Я с телефона так что криво вставлю код ))
val updatedRequest = request
.modify(_.requestStatus).setTo(status)
.modify(_.processTime).setTo(env.currentTime)

Google

Eugene
22.05.2018
18:28:35
Как-то так

Oleg
22.05.2018
18:28:42
Если лень писать andThen,
Можно юзануть Endo из scalaz или самому эти 4 строки моноида написатт написать и композить через combineAll

Eugene
22.05.2018
18:38:04
Спасибо, но в quicklens ничего и писать не надо ) только там на макросах а не на композициях

Oleg
22.05.2018
18:38:20
.modify(_.field).setTo(x)
vs
field.set(x) compose
телеграммовское окошко подсказывает, что в макросе вверху больше букав

Nick
22.05.2018
18:40:11
Ты в любом случае сеттеры композируешь
Макросы там внутри

Oleg
22.05.2018
18:41:53
Только я могу "поля" придусать сам
Композтить, например, с айтемами хешмапов, с альтернативами силд трейтов

Nick
22.05.2018
18:42:39
Кароч, монокль зе бест

Oleg
22.05.2018
18:43:37
и если, самое главное, однажды тип перестанет быть кейс классом, я смогу быстренько написать эти линзы ручками в компаньоне, сохранив обратную-совмкстимость

Google

Oleg
22.05.2018
18:46:47
но квикленс выигрывает в синтаксисе для просто полей, конечно

Eugene
22.05.2018
18:46:54

Oleg
22.05.2018
18:47:49

Eugene
22.05.2018
18:48:04
:)

Oleg
22.05.2018
18:48:35
50% моего применения монокля квикленс никак не осилил бы

Eugene
22.05.2018
18:49:21
Если бы скинул примеры киллерфич из этих 50% то было бы круто

Nick
22.05.2018
18:49:33

Oleg
22.05.2018
18:53:44
Вторая киллерфича: думаю понятно, что для любой монады можно сделать Iso[F[F[A]], F[A]]
А это в купе со встроенной
Setter[F[A], A] для функторов даёт отличный способ продираться через эффекты в полях, сохраняя рассудок

Eugene
22.05.2018
18:58:14
Интересно спасибо. Изучу подробнее :)

Oleg
22.05.2018
18:59:15
Третья: уже обсуждавшиеся с @notxcain способы сфокусировать стейт, еррор или райтер на каком-то куске (ах)
Четвёртая:
Я могу сделать
Traversal[Foo, Bar] для
case class Foo(bar1: Bar, bar2: Bar, bar3: Bar)
который реально будет обходить несколько полей за одну операцию
Пятая: есть встроенные json линзы для circe, как минимум пара человек у нас очень активно из их юзают

Eugene
22.05.2018
19:08:13
Насколько сложно рефакторить? Вот создал стопицот линз - их надо руками потом исправить если поля переехали в агрегат например?

Oleg
22.05.2018
19:12:25
Я просто в седьмой наверное раз повторяю это и не могу поверить.
Что в хашкеле субтайпинг есть, а в шакалке - нет

Mikhail
23.05.2018
04:37:52

Oleg
23.05.2018
04:40:12
там больше нет таких макросов

Google

Oleg
23.05.2018
04:41:28
@ezhulkov А в квикленс идея краснит на .each ?

Eugene
23.05.2018
05:20:34

Alexander
23.05.2018
07:09:42
там сплошые макросы, краснила на каждом шагу раньше (да и сейчас скорее всего)

Mikhail
23.05.2018
07:37:54
val double: Int ⇒ Int = _ * 2
Apply[Option].ap(Some(double))(None) should be(None)
Apply[Option].ap(None)(Some(1)) should be(None)
Apply[Option].ap(None)(None) should be(None)

Grigory
23.05.2018
07:38:35
тест на репликанта?

Mikhail
23.05.2018
07:38:43
Почему операции с None из котов всегда в итоге None? Разве это не ноль из теорката?
Ну или там например пустая строка...
val addTwo: Int ⇒ Int = _ + 2
Apply[Option].map(None)(addTwo) should be(None)
Туда же.

Grigory
23.05.2018
07:47:49
@Mikhail_Kobenko какую функцию ты хочешь?

Aleksei
23.05.2018
07:48:08
я так понимаю типа как ноль для моноида ему надо

Aleksei
23.05.2018
07:48:14
чтобы ничего плюс два было два

Mikhail
23.05.2018
07:51:48
Да, Алексей прав. Чтобы пришел None и я с ним мог работать, получить например Some(List(1,2,3))

Grigory
23.05.2018
07:55:09
потому что в котах такое определение апликации
посмотри комбайн моноида
есть инстансы и для листа и для опшона и комбайн nonEmptyList, Nil даст nonEmptyList

Mikhail
23.05.2018
08:03:49
Monoid[List[Int]].combine(None.toList, List(1,2,3)) should be(List(1,2,3))
Вариант черновой)
Спс.

Google

Eugene
23.05.2018
08:13:54

Oleg
23.05.2018
08:30:37
ну получается дальше each я уже с подсказкой не пойду
т.е ctrl space до первого Option

Eugene
23.05.2018
08:40:55


Nick
23.05.2018
08:47:56
а почему нельзя лифтануть find и store в task?
а, собственно в ответе так и делают

Eugene
23.05.2018
08:51:00

Nick
23.05.2018
08:51:53
на мои взгляд эт дичь

Admin
ERROR: S client not available

Nick
23.05.2018
08:52:04
нафига держать транзакцию так долго

Aleksei
23.05.2018
08:52:17
а пример можно того что вы хотите сделать?

Nick
23.05.2018
08:52:30

Aleksei
23.05.2018
08:53:00
конкретный пример того что господин хочет сделать и зачем ему свои таски лифтить в коннекшнио а не наоборот
типа чтобы прочитать изменить сохранить и все в одной транзакции?

Nick
23.05.2018
08:53:30
я делаю иначе, у меня есть специальный пул, который обрабатывает все общение с базой в Async
в том случае все выродилось бы в композицию из 3 асинков
транзакция по сути нужна лишь в store

Eugene
23.05.2018
08:54:25

Nick
23.05.2018
08:54:51
обьясни мне, зачем тебе одна транзакция?

Eugene
23.05.2018
08:54:55
на мои взгляд эт дичь
это уже вопрос другого уровня ) интересна была сама техническая возможность как сделать

Google

Nick
23.05.2018
08:55:28
прежде чем делать, задай вопрос "а нельзя ли сделать лучше?"

Eugene
23.05.2018
08:55:39

Alexey
23.05.2018
08:56:23

Nick
23.05.2018
08:56:36

Alexey
23.05.2018
08:56:49
Какого store?

Nick
23.05.2018
08:56:59
открой so
я бы просто добавил версионность и оптимистик апдейт

Eugene
23.05.2018
08:57:42
открой so
там совсем синтетический пример, на него не надо полагаться
на SO скорее про то как смиксовать 2 разных дататайпа

Alexey
23.05.2018
08:59:54
я бы просто добавил версионность и оптимистик апдейт
Чтобы так сделать, надо изначально закладывать эту возможность, а если например у людей особо нагрузки нет (типо пишут коробку для предприятий в 100 человек), нахрена им городить эти сложности, почему нельзя взять и запустить одну транзакцию на операцию?

Denis
23.05.2018
09:00:39
По-моему спрашивать «зачем тебе одна транзакция» как-то странно

Eugene
23.05.2018
09:01:03
да половина монолитов так работает - открывает транзакцию на запрос и закрывает её в конце.
те же веб приложения на J2EE и сервлетах

Nick
23.05.2018
09:01:33

Alexey
23.05.2018
09:01:39
Есть разные требования и разные решения ?♂️

Nick
23.05.2018
09:02:01

Alexey
23.05.2018
09:03:31
Бле, ну очень сильно зависит от того что это за действие
Сходить в соседний сервис - нет

Eugene
23.05.2018
09:03:48
если зачитать из файла - почему бы и нет?
если мы хотим сделать все в pure виде и оборачивать эффекты в IO/Task

Nick
23.05.2018
09:05:05
я все понял, можно не продолжать)