doilux’s tech blog

ITに関する備忘録。 DDP : http://doiluxng.hatenablog.com/entry/2018/01/01/195409

Lens便利

HoloLensの話ではない。scalaz.Lensの話。

 

これが

 

```
object Main extends App {

val a = A(B(C(D(1))))
println(a)
val copy = a.copy(a.b.copy(a.b.c.copy(a.b.c.d.copy(2))))
println(copy)
}

case class D(value: Int)
case class C(d: D)
case class B(c: C)
case class A(b: B)

```

 

こうなる

 

```
object Main extends App {

val a = A(B(C(D(1))))
println(a)


val AB = scalaz.Lens.lensu[A, B](
(a, b) => a.copy(b = b),
_.b
)

val BC = scalaz.Lens.lensu[B, C](
(b, c) => b.copy(c = c),
_.c
)

val CD = scalaz.Lens.lensu[C, D](
(c, d) => c.copy(d = d),
_.d
)

val DX = scalaz.Lens.lensu[D, Int](
(d, x) => d.copy(x = x),
_.x
)

val A2X = AB >=> BC >=> CD >=> DX

val copy2 = A2X.set(a, 2)
println(copy2)
}

case class D(x: Int)
case class C(d: D)
case class B(c: C)
case class A(b: B)
```

 

テストデータ作るのに便利