Skip to content

Instantly share code, notes, and snippets.

@bmjames
Created April 3, 2012 16:12
Show Gist options
  • Save bmjames/2293263 to your computer and use it in GitHub Desktop.
Save bmjames/2293263 to your computer and use it in GitHub Desktop.
Partial lenses (Scalaz 7)
case class Person(pants: Option[Pants])
case class Pants(pocket: Option[Pocket])
case class Pocket(cash: Option[Cash])
case class Cash(value: String)
val pants: Person @-@ Option[Pants] =
lensG(_.pants, p => ps => p.copy(pants = ps))
val pocket: Pants @-@ Option[Pocket] =
lensG(_.pocket, ps => p => ps.copy(pocket = p))
val cash: Pocket @-@ Option[Cash] =
lensG(_.cash, p => c => p.copy(cash = c))
val value: Cash @-@ String =
lensG(_.value, c => v => c.copy(value = v))
val someCashValue: Person @-? String =
~pants <=< somePLens <=<
~pocket <=< somePLens <=<
~cash <=< somePLens <=<
~value
val ben = Person(Some(Pants(Some(Pocket(Some(Cash("zilch")))))))
someCashValue.mod(_ + ", zero, nada", ben)
// Person(Some(Pants(Some(Pocket(Some(Cash(zilch, zero, nada)))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment