Size: a a a

Scala User Group

2020 June 06

AS

Alex Sh in Scala User Group
Переслано от Alex Sh
Народ, привет.
Можт кто-нть подсказать, умеет ли monocle автоматически выводить/генерировать линзы по типам?

Например есть что-то типа:
final case class UserName(value: String)
final case class Street(value: String)
final case class HouseNum(value: Int)
final case class Address(street: Street, num: HouseNum)
final case class User(name: UserName, address: Address)

и чтобы можно было просто написать:
val user = User(???, ???)
DeriveLens.set[User, HouseNum](HouseNum(100500))(user)

без необходимости прописывать все линзы вручную:
val address2street: Lens[Address, Street]  = GenLens[Address](_.street)
val address2house: Lens[Address, HouseNum] = GenLens[Address](_.num)
val user2name: Lens[User, UserName]        = GenLens[User](_.name)
val user2address: Lens[User, Address]      = GenLens[User](_.address)
val user2street: Lens[User, Street]        = user2address.composeLens(address2street)
val user2house: Lens[User, HouseNum]       = user2address.composeLens(address2house)
val name2value: Lens[UserName, String]     = GenLens[UserName](_.value)
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Alex Sh
Переслано от Alex Sh
Народ, привет.
Можт кто-нть подсказать, умеет ли monocle автоматически выводить/генерировать линзы по типам?

Например есть что-то типа:
final case class UserName(value: String)
final case class Street(value: String)
final case class HouseNum(value: Int)
final case class Address(street: Street, num: HouseNum)
final case class User(name: UserName, address: Address)

и чтобы можно было просто написать:
val user = User(???, ???)
DeriveLens.set[User, HouseNum](HouseNum(100500))(user)

без необходимости прописывать все линзы вручную:
val address2street: Lens[Address, Street]  = GenLens[Address](_.street)
val address2house: Lens[Address, HouseNum] = GenLens[Address](_.num)
val user2name: Lens[User, UserName]        = GenLens[User](_.name)
val user2address: Lens[User, Address]      = GenLens[User](_.address)
val user2street: Lens[User, Street]        = user2address.composeLens(address2street)
val user2house: Lens[User, HouseNum]       = user2address.composeLens(address2house)
val name2value: Lens[UserName, String]     = GenLens[UserName](_.value)
Было бы быстрее отвечать, если бы там не вопросики стояли
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Теперь придётся самому придумывать код вместо вопросиков
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Вот почему я люблю вопросы в скасти
источник

C

Combot in Scala User Group
Добро пожаловать в самое дружелюбное комьюнити.
источник

AS

Alex Sh in Scala User Group
Oleg ℕizhnik
Вот почему я люблю вопросы в скасти
источник
2020 June 07

Oℕ

Oleg ℕizhnik in Scala User Group
поздно
источник

AS

Alex Sh in Scala User Group
Oleg ℕizhnik
поздно
😔
источник

Oℕ

Oleg ℕizhnik in Scala User Group
источник

Oℕ

Oleg ℕizhnik in Scala User Group
такое нужно было?
источник

AS

Alex Sh in Scala User Group
Oleg ℕizhnik
такое нужно было?
да 👍
Только один вопрос, можно ли обойтись без использования @ClassyOptics аннотаций непосредственно на доменных объектах?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Нет
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Ну можно всё руками писать
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Не знаю, зачем
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Вообще если линзы генерить не в компаньонах доменных объектов, то где
источник

Oℕ

Oleg ℕizhnik in Scala User Group
и зачем
источник

AS

Alex Sh in Scala User Group
Oleg ℕizhnik
Не знаю, зачем
Мы не можем  привязывать классы доменной модели к конкретной библиотеке
источник

AS

Alex Sh in Scala User Group
Эти классы используются в разных проектах.
В некоторых линзы не нужны.
В некоторых что-то другое может использоваться потенциально.
источник

Oℕ

Oleg ℕizhnik in Scala User Group
И почему бы не сгененировать сразу всё?
источник

AS

Alex Sh in Scala User Group
+ иногда надо генерить линзы для классов, которые мы не контролируем
источник