Skip to content

Repository files navigation

Quicklens

Maven Central

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"

About

Modify deeply nested case class fields

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages