From 3bfe9e99823cba3f422d8c236e64fb67da1c6c77 Mon Sep 17 00:00:00 2001 From: julien-truffaut Date: Tue, 11 Mar 2014 21:42:45 +0000 Subject: [PATCH] #15 - Made generic lenses work using Generic but need to call Generic.product before --- .../src/main/scala/monocle/thirdparty/HList.scala | 15 ++++++++++++--- .../src/main/scala/monocle/HListExample.scala | 8 ++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/monocle/thirdparty/HList.scala b/core/src/main/scala/monocle/thirdparty/HList.scala index 7711525c9..1b9eb2ffd 100644 --- a/core/src/main/scala/monocle/thirdparty/HList.scala +++ b/core/src/main/scala/monocle/thirdparty/HList.scala @@ -1,7 +1,9 @@ package monocle.thirdparty import monocle.{SimpleLens, Iso, Lens} +import shapeless.HList._ import shapeless._ +import shapeless.ops.hlist.{ReplaceAt, At} object hlist extends HListInstances @@ -20,9 +22,16 @@ trait HListInstances { hl => hl.head -> hl.tail.head ) - def first[S, A, L <: HList](implicit gen : Generic.Aux[S, L], nth : HListNthLensAux[L, shapeless.nat._0.N, A]) = at(shapeless.nat._0) - def at[S, A, L <: HList](n : Nat)(implicit gen : Generic.Aux[S, L], nth : HListNthLensAux[L, n.N, A]) = - SimpleLens[S, A](s => nth.get(gen.to(s)), (s, a) => gen.from(nth.set(gen.to(s))(a)) ) + def first[S, A, L <: HList](implicit gen: Generic.Aux[S, L], + at: At.Aux[L, shapeless.nat._0.N, A], + replace: ReplaceAt.Aux[L, shapeless.nat._0.N, A, (A, L)]) = _at(shapeless.nat._0) + + + + def _at[S, A, L <: HList](n : Nat)(implicit gen: Generic.Aux[S, L], + at: At.Aux[L, n.N, A], + replace: ReplaceAt.Aux[L, n.N, A, (A, L)]) = + SimpleLens[S, A](s => gen.to(s).at(n), (s, a) => gen.from(gen.to(s).updatedAt(n, a)) ) } diff --git a/examples/src/main/scala/monocle/HListExample.scala b/examples/src/main/scala/monocle/HListExample.scala index 3a76fd262..1221e2a48 100644 --- a/examples/src/main/scala/monocle/HListExample.scala +++ b/examples/src/main/scala/monocle/HListExample.scala @@ -2,6 +2,7 @@ package monocle import monocle.thirdparty.hlist._ import shapeless._ +import shapeless.Generic._ object HListExample extends App { @@ -18,9 +19,12 @@ object HListExample extends App { case class Person(name : String, age : Int) - val julien = Person("Julien", 27) + val character = Person("Julien", 27) - println( first.get(julien) ) + implicit val gen = Generic.product[Person] + + println( first.get(character) ) + println( first.set(character, "Roger"))