В монокле есть магический макрос @PLenses Если ты генерируешь @PLenses final case class Foo[A, B, C](a: A, b: B, c: C) Для каждого поля он сгенерирует полиморфную линзу, которая может менять тип поля. Например Foo.a[Int, String, Double, Long] будет иметь тип PLens[ Foo[Int,String,Double], Foo[Long,String,Double], Int, Long]
Ну и чтобы дополнить картину, нужно помнить, что линза сама по себе имеет методы Traversal поэтому имея PLens[FooOpt, Option[A], Foo, A] ты можешь запустить метод modifyF Option[A] => Validated[..., A] и получить Validated[Foo]
Обсуждают сегодня