Hi All,
And here is the REPL session about Lenses in scalaz.
scala> case class Address(city: String, zip: Int)
defined class Address
scala> case class User(name: String, address: Address)
defined class User
scala> val user = User("Nad", Address("Sallad", 79071))
user: User = User(Nad,Address(Sallad,79071))
scala> val updatedUser = user.copy(name = "Evets")
updatedUser: User = User(Evets,Address(Sallad,79071))
scala> val updatedAddress = user.copy(address = user.address.copy(city
= "Revned"))
updatedAddress: User = User(Nad,Address(Revned,79071))
scala> val nameL: Lens[User, String] = Lens.lensu((u, newName) =>
u.copy(name = newName), _.name)
nameL: scalaz.Lens[User,String] = scalaz.LensFunctions$$anon$5@3a3941c8
scala> val addrL: Lens[User, Address] = Lens.lensu((u, newAddr) =>
u.copy(address = newAddr), _.address)
addrL: scalaz.Lens[User,Address] = scalaz.LensFunctions$$anon$5@5dd68001
scala> val zipL: Lens[Address, Int] = Lens.lensu((a, newZip) =>
a.copy(zip = newZip), _.zip)
zipL: scalaz.Lens[Address,Int] = scalaz.LensFunctions$$anon$5@48a5bc0c
scala> nameL.get(user)
res11: String = Nad
scala> addrL.set(user, Address("Empty", 0))
res12: User = User(Nad,Address(Empty,0))
scala> zipL compose addrL
res13: scalaz.LensFamily[User,User,Int,Int] =
scalaz.LensFamilyFunctions$$anon$4@3802736c
scala> res13.get(user)
res15: Int = 79071
scala> user
res16: User = User(Nad,Address(Sallad,79071))
scala> res13.set(user, 45678)
res17: User = User(Nad,Address(Sallad,45678))
Bill
----
Bill Venners
Artima, Inc.
http://www.artima.com