+ - 0:00:00
Notes for current slide
Notes for next slide

Optics libraries

Nicolas Rinaudo • @NicolasRinaudoBesedo

1 / 22

Libraries

2 / 22

Scalaz

import scalaz.Lens.lensu
val classifierLens = lensu[MlService, Classifier](
(s, a) => s.copy(classifier = a),
s => s.classifier
)
val nameLens = lensu[Classifier, String](
(s, a) => s.copy(name = a),
s => s.name
)
val classifierName = classifierLens andThen nameLens
3 / 22

Scalaz

import scalaz.Lens.lensu
val classifierLens = lensu[MlService, Classifier](
(s, a) => s.copy(classifier = a),
s => s.classifier
)
val nameLens = lensu[Classifier, String](
(s, a) => s.copy(name = a),
s => s.name
)
val classifierName = classifierLens andThen nameLens
4 / 22

Scalaz

import scalaz.Lens.lensu
val classifierLens = lensu[MlService, Classifier](
(s, a) => s.copy(classifier = a),
s => s.classifier
)
val nameLens = lensu[Classifier, String](
(s, a) => s.copy(name = a),
s => s.name
)
val classifierName = classifierLens andThen nameLens
5 / 22

Scalaz

import scalaz.Lens.lensu
val classifierLens = lensu[MlService, Classifier](
(s, a) => s.copy(classifier = a),
s => s.classifier
)
val nameLens = lensu[Classifier, String](
(s, a) => s.copy(name = a),
s => s.name
)
val classifierName = classifierLens andThen nameLens
6 / 22

Scalaz

import scalaz.Lens.lensu
val classifierLens = lensu[MlService, Classifier](
(s, a) => s.copy(classifier = a),
s => s.classifier
)
val nameLens = lensu[Classifier, String](
(s, a) => s.copy(name = a),
s => s.name
)
val classifierName = classifierLens andThen nameLens
7 / 22

Scalaz

classifierName.mod(_.toUpperCase, service)
// res0: MlService = MlService(Login(jsmith,Tr0ub4dor&3),Classifier(NEWS20,20))
8 / 22

Shapeless

import shapeless.lens
val classifierName = lens[MlService].classifier.name
val userName = lens[MlService].auth.user
9 / 22

Shapeless

import shapeless.lens
val classifierName = lens[MlService].classifier.name
val userName = lens[MlService].auth.user
10 / 22

Shapeless

classifierName.modify(service)(_.toUpperCase)
// res1: MlService = MlService(Login(jsmith,Tr0ub4dor&3),Classifier(NEWS20,20))
userName.set(service)("psmith")
// res2: MlService = MlService(Login(psmith,Tr0ub4dor&3),Classifier(news20,20))
11 / 22

Quicklens

import com.softwaremill.quicklens._
val classifierName = modify[MlService](_.classifier.name)
val userName = modify[MlService](_.auth.when[Login].user)
12 / 22

Quicklens

import com.softwaremill.quicklens._
val classifierName = modify[MlService](_.classifier.name)
val userName = modify[MlService](_.auth.when[Login].user)
13 / 22

Quicklens

import com.softwaremill.quicklens._
val classifierName = modify[MlService](_.classifier.name)
val userName = modify[MlService](_.auth.when[Login].user)
14 / 22

Quicklens

import com.softwaremill.quicklens._
val classifierName = modify[MlService](_.classifier.name)
val userName = modify[MlService](_.auth.when[Login].user)
15 / 22

Quicklens

classifierName.using(_.toUpperCase)(service)
// res3: MlService = MlService(Login(jsmith,Tr0ub4dor&3),Classifier(NEWS20,20))
userName.setTo("psmith")(service)
// res4: MlService = MlService(Login(psmith,Tr0ub4dor&3),Classifier(news20,20))
16 / 22

Monocle

import monocle.macros._
val classifierName = GenLens[MlService](_.classifier.name)
val userName = GenLens[MlService](_.auth).
composePrism(GenPrism[Auth, Login]).
composeLens(GenLens[Login](_.user))
17 / 22

Monocle

import monocle.macros._
val classifierName = GenLens[MlService](_.classifier.name)
val userName = GenLens[MlService](_.auth).
composePrism(GenPrism[Auth, Login]).
composeLens(GenLens[Login](_.user))
18 / 22

Monocle

import monocle.macros._
val classifierName = GenLens[MlService](_.classifier.name)
val userName = GenLens[MlService](_.auth).
composePrism(GenPrism[Auth, Login]).
composeLens(GenLens[Login](_.user))
19 / 22

Monocle

import monocle.macros._
val classifierName = GenLens[MlService](_.classifier.name)
val userName = GenLens[MlService](_.auth).
composePrism(GenPrism[Auth, Login]).
composeLens(GenLens[Login](_.user))
20 / 22

Monocle

classifierName.modify(_.toUpperCase)(service)
// res5: MlService = MlService(Login(jsmith,Tr0ub4dor&3),Classifier(NEWS20,20))
userName.set("psmith")(service)
// res6: MlService = MlService(Login(psmith,Tr0ub4dor&3),Classifier(news20,20))
21 / 22

Questions?

Nicolas Rinaudo • @NicolasRinaudoBesedo

22 / 22

Libraries

2 / 22
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow