case class SubModel(i: Int)
case class Model(sub: SubModel, s: String)
val model = Model(SubModel(0), "-")
model.toZipper.down.updateBy(_ + 1).root.reify // Model(SubModel(1),"-")
import shapeless._
import syntax.zipper._
case class SubModel(i: Int)
case class Model(sub: SubModel, s: String)
implicit class ZipperModify[C, L <: HList, R <: HList, P](private val zipper: Zipper[C, L, R, P]) extends AnyVal {
import shapeless.ops.zipper._
def modify[A, B](f: A => B)(implicit get: Get[zipper.Self] { type Out = A }, put: Put[zipper.Self, B]): put.Out = put(zipper, f(get(zipper)))
}
val model = Model(SubModel(0), "-")
model.toZipper.down.modify { i: Int => i + 1 }.root.reify // Model(SubModel(1),-)