Modify deeply nested fields in case classes:
importcom.softwaremill.quicklens._caseclassStreet(name: String)
caseclassAddress(street: Street)
caseclassPerson(address: Address)
valperson=Person(Address(Street("1 Functional Rd.")))
valp2= modify(person)(_.address.street.name).using(_.toUpperCase)
valp3= modify(person)(_.address.street.name).setTo("3 OO Ln.")Traverse options/lists using .each:
importcom.softwaremill.quicklens._caseclassStreet(name: String)
caseclassAddress(street: Option[Street])
caseclassPerson(addresses: List[Address])
valperson=Person(List(
Address(Some(Street("1 Functional Rd."))),
Address(Some(Street("2 Imperative Dr.")))
))
valp2= modify(person)(_.addresses.each.street.each.name).using(_.toUpperCase).each can only be used inside a modify and "unwraps" the container (currently supports Lists and Options).
You can add support for your own containers by providing an implicit QuicklensFunctor[C] with the appropriate
C type parameter.
Re-usable modifications (lenses):
importcom.softwaremill.quicklens._valmodifyStreetName= modify(_: Person)(_.address.street.name)
valp3= modifyStreetName(person).using(_.toUpperCase)
valp4= modifyStreetName(anotherPerson).using(_.toLowerCase)
//valupperCaseStreetName= modify(_: Person)(_.address.street.name).using(_.toUpperCase)
valp5= upperCaseStreetName(person)Composing lenses:
importcom.softwaremill.quicklens._valmodifyAddress= modify(_: Person)(_.address)
valmodifyStreetName= modify(_: Address)(_.street.name)
valp6= (modifyAddress andThenModify modifyStreetName)(person).using(_.toUpperCase)Similar to lenses (1, 2), but without the actual lens creation.
Read the blog for more info.
Available in Maven Central:
valquicklens="com.softwaremill.quicklens"%%"quicklens"%"1.3"