case class Classifier( name : String, classCount: Int)
case class Classifier( name : String, classCount: Int)
case class Classifier( name : String, classCount: Int)
case class Classifier( name : String, classCount: Int)
sealed trait Authcase class Token( token: String) extends Authcase class Login( user : String, password: String) extends Auth
sealed trait Authcase class Token( token: String) extends Authcase class Login( user : String, password: String) extends Auth
sealed trait Authcase class Token( token: String) extends Authcase class Login( user : String, password: String) extends Auth
sealed trait Authcase class Token( token: String) extends Authcase class Login( user : String, password: String) extends Auth
case class MlService( auth : Auth, classifier: Classifier)
case class MlService( auth : Auth, classifier: Classifier)
case class MlService( auth : Auth, classifier: Classifier)
case class MlService( auth : Auth, classifier: Classifier)
⋀
.⋀
.⋁
.⋀
.⋁
.val service = MlService( Login("jsmith", "Tr0ub4dor&3"), Classifier("news20", 20))
val service = MlService( Login("jsmith", "Tr0ub4dor&3"), Classifier("news20", 20))
Java
service.classifier.name = "NEWS20"
Java
service.classifier.name = "NEWS20"
Scala
service.copy( classifier = service.classifier.copy( name = "NEWS20" ))
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S}
val nameSetter: Setter[MlService, String] = ???val updated: MlService = nameSetter.set("NEWS20")(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A}
val classifierName: String = nameSetter.get(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A}
val classifierName: String = nameSetter.get(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A}
val classifierName: String = nameSetter.get(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A}
val classifierName: String = nameSetter.get(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
val updated: MlService = nameSetter.modify(_.toUpperCase)(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
val updated: MlService = nameSetter.modify(_.toUpperCase)(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
val updated: MlService = nameSetter.modify(_.toUpperCase)(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
val updated: MlService = nameSetter.modify(_.toUpperCase)(service)
trait Setter[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
val updated: MlService = nameSetter.modify(_.toUpperCase)(service)
trait Lens[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
trait Lens[S, A] { def set(a: A)(s: S): S def get(s: S): A def modify(f: A => A)(s: S): S = set(f(get(s)))(s)}
object Lens { def apply[S, A]( setter: (A, S) => S, getter: S => A ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
object Lens { def apply[S, A]( setter: (A, S) => S, getter: S => A ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
object Lens { def apply[S, A]( setter: (A, S) => S, getter: S => A ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
object Lens { def apply[S, A]( setter: (A, S) => S, getter: S => A ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
object Lens { def apply[S, A]( setter: (A, S) => S, getter: S => A ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
type Set[S, A] = (A, S) => Stype Get[S, A] = S => A
type Set[S, A] = (A, S) => Stype Get[S, A] = S => A
type Set[S, A] = (A, S) => Stype Get[S, A] = S => A
object Lens { def apply[S, A]( setter: Set[S, A], getter: Get[S, A] ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
object Lens { def apply[S, A]( setter: Set[S, A], getter: Get[S, A] ) = new Lens[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
val serviceClassifier = Lens[MlService, Classifier]( setter = (a, s) => s.copy(classifier = a), getter = s => s.classifier)
val serviceClassifier = Lens[MlService, Classifier]( setter = (a, s) => s.copy(classifier = a), getter = s => s.classifier)
val serviceClassifier = Lens[MlService, Classifier]( setter = (a, s) => s.copy(classifier = a), getter = s => s.classifier)
val serviceClassifier = Lens[MlService, Classifier]( setter = (a, s) => s.copy(classifier = a), getter = s => s.classifier)
val classifierName = Lens[Classifier, String]( setter = (a, s) => s.copy(name = a), getter = s => s.name)
serviceClassifier.modify(classifierName.set("NEWS20"))(service)// res1: MlService = MlService(Login(jsmith,Tr0ub4dor&3),Classifier(NEWS20,20))
def setName(name: String, service: MlService) = serviceClassifier.modify(classifierName.set(name))(service)
def setName(name: String, service: MlService) = serviceClassifier.modify(classifierName.set(name))(service)
def setName(name: String, service: MlService) = serviceClassifier.modify(classifierName.set(name))(service)
def setName( serviceClassifier: Lens[MlService, Classifier], classifierName : Lens[Classifier, String] ) (name: String, service: MlService): MlService = serviceClassifier.modify(classifierName.set(name))(service)
def setName( serviceClassifier: Lens[MlService, Classifier], classifierName : Lens[Classifier, String] ) (name: String, service: MlService): MlService = serviceClassifier.modify(classifierName.set(name))(service)
def setName( serviceClassifier: Lens[MlService, Classifier], classifierName : Lens[Classifier, String] ) (name: String, service: MlService): MlService = serviceClassifier.modify(classifierName.set(name))(service)
def setName( serviceClassifier: Lens[MlService, Classifier], classifierName : Lens[Classifier, String] ) (name: String, service: MlService): MlService = serviceClassifier.modify(classifierName.set(name))(service)
def setter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) (b: B, s: S): S = l1.modify(l2.set(b))(s)
def setter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) (b: B, s: S): S = l1.modify(l2.set(b))(s)
def setter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) (b: B, s: S): S = l1.modify(l2.set(b))(s)
def setter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) : Set[S, B] = (b, s) => l1.modify(l2.set(b))(s)
def setter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) : Set[S, B] = (b, s) => l1.modify(l2.set(b))(s)
def getter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) : Get[S, B] = s => l2.get(l1.get(s))
def getter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) : Get[S, B] = s => l2.get(l1.get(s))
def getter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) : Get[S, B] = s => l2.get(l1.get(s))
def getter[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) : Get[S, B] = s => l2.get(l1.get(s))
def composeLL[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) = Lens[S, B]( setter(l1, l2), getter(l1, l2) )
def composeLL[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) = Lens[S, B]( setter(l1, l2), getter(l1, l2) )
def composeLL[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) = Lens[S, B]( setter(l1, l2), getter(l1, l2) )
def composeLL[S, A, B]( l1: Lens[S, A], l2: Lens[A, B] ) = Lens[S, B]( setter(l1, l2), getter(l1, l2) )
val serviceClassifierName = composeLL( serviceClassifier, classifierName)
serviceClassifierName.modify(_.toUpperCase)(service)// res2: MlService = MlService(Login(jsmith,Tr0ub4dor&3),Classifier(NEWS20,20))
val service = MlService( Login("jsmith", "Tr0ub4dor&3"), Classifier("news20", 20))
val service = MlService( Login("jsmith", "Tr0ub4dor&3"), Classifier("news20", 20))
val serviceAuth = Lens[MlService, Auth]( setter = (a, s) => s.copy(auth = a), getter = s => s.auth)
val authUser = Lens[Auth, String]( setter = (a, s) => ???, // Auth -> String getter = s => s match { case Login(user, _) => user case Token(token) => ??? })
val authUser = Lens[Auth, String]( setter = (a, s) => ???, // Auth -> String getter = s => s match { case Login(user, _) => user case Token(token) => ??? })
val authUser = Lens[Auth, String]( setter = (a, s) => ???, // Auth -> String getter = s => s match { case Login(user, _) => user case Token(token) => ??? })
val authUser = Lens[Auth, String]( setter = (a, s) => ???, // Auth -> String getter = s => s match { case Login(user, _) => user case Token(token) => ??? })
val authUser = Lens[Auth, String]( setter = (a, s) => ???, // Auth -> String getter = s => s match { case Login(user, _) => user case Token(token) => ??? })
val authUser = Lens[Auth, String]( setter = (a, s) => ???, // Auth -> String getter = s => s match { case Login(user, _) => user case Token(token) => ??? })
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
trait Prism[S, A] { def set(a: A): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a)) case None => s }}
val authLogin: Prism[Auth, Login] = ???val updated: Auth = authLogin.set(Login("foo", "bar"))val login: Option[Login] = authLogin.get(service.auth)
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) }}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) }}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) }}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) }}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) }}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) }}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) } def fromPartial[S, A]( setter: A => S, getter: PartialFunction[S, A] ) = Prism(setter, getter.lift)}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) } def fromPartial[S, A]( setter: A => S, getter: PartialFunction[S, A] ) = Prism(setter, getter.lift)}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) } def fromPartial[S, A]( setter: A => S, getter: PartialFunction[S, A] ) = Prism(setter, getter.lift)}
object Prism { def apply[S, A]( setter: A => S, getter: S => Option[A] ) = new Prism[S, A] { override def set(a: A) = setter(a) override def get(s: S) = getter(s) } def fromPartial[S, A]( setter: A => S, getter: PartialFunction[S, A] ) = Prism(setter, getter.lift)}
val authLogin = Prism.fromPartial[Auth, Login]( setter = a => a, getter = { case s: Login => s })
val authLogin = Prism.fromPartial[Auth, Login]( setter = a => a, getter = { case s: Login => s })
val authLogin = Prism.fromPartial[Auth, Login]( setter = a => a, getter = { case s: Login => s })
val authLogin = Prism.fromPartial[Auth, Login]( setter = a => a, getter = { case s: Login => s })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Prism[S, B]( // B => S setter = b => { val a: A = p.set(b) val s: S = ??? s }, // S => B getter = s => p.get(l.get(s)))
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Lens[S, B]( // (B, S) => S setter = (b, s) => l.set(p.set(b))(s), // S => B getter = s => { val a: A = l.get(s) val b: B = ??? b })
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
trait Optional[S, A] { def set(a: A)(s: S): S def get(s: S): Option[A] def modify(f: A => A)(s: S): S = get(s) match { case Some(a) => set(f(a))(s) case None => s }}
val serviceLogin: Optional[MlService, Login] = ???val updated: MlService = serviceLogin.set(Login("psmith", "Tr0ub4dor&3"))(service)val login: Option[Login] = serviceLogin.get(service)
object Optional { def apply[S, A]( setter: (A, S) => S, getter: S => Option[A] ) = new Optional[S, A] { override def set(a: A)(s: S) = setter(a, s) override def get(s: S) = getter(s) }}
def composeLP[S, A, B]( l: Lens[S, A], p: Prism[A, B]) = Optional[S, B]( setter = (b, s) => l.set(p.set(b))(s), getter = s => p.get(l.get(s)))
def composePP[S, A, B]( p1: Prism[S, A], p2: Prism[A, B]) = Prism[S, B]( setter = b => p1.set(p2.set(b)), getter = s => p1.get(s).flatMap(p2.get))
def composePL[S, A, B]( p: Prism[S, A], l: Lens[A, B]) = Optional[S, B]( setter = (b, s) => p.modify(l.set(b))(s), getter = s => p.get(s).map(l.get))
def composeOO[S, A, B]( o1: Optional[S, A], o2: Optional[A, B]) = Optional[S, B]( setter = (b, s) => o1.modify(o2.set(b))(s), getter = s => o1.get(s).flatMap(o2.get))
def composeOP[S, A, B]( o: Optional[S, A], p: Prism[A, B]) = Optional[S, B]( setter = (b, s) => o.set(p.set(b))(s), getter = s => o.get(s).flatMap(p.get))
def composePO[S, A, B]( p: Prism[S, A], o: Optional[A, B]) = Optional[S, B]( setter = (b, s) => p.modify(o.set(b))(s), getter = s => p.get(s).flatMap(o.get))
def composeOL[S, A, B]( o: Optional[S, A], l: Lens[A, B]) = Optional[S, B]( setter = (b, s) => o.modify(l.set(b))(s), getter = s => o.get(s).map(l.get))
def composeLO[S, A, B]( l: Lens[S, A], o: Optional[A, B]) = Optional[S, B]( setter = (b, s) => l.modify(o.set(b))(s), getter = s => o.get(l.get(s)))
val serviceLogin = composeLP( serviceAuth, authLogin)
val loginUser = Lens[Login, String]( setter = (a, s) => s.copy(user = a), getter = s => s.user)
val serviceUser = composeOL( serviceLogin, loginUser)
serviceUser.set("psmith")(service)// res3: MlService = MlService(Login(psmith,Tr0ub4dor&3),Classifier(news20,20))
{ "auth": { "user" : "psmith", "password": "Tr0ub4dor&3" }, "classifier": { "name" : "news20", "classCount": 20 }}
{ "auth": { "user" : "psmith", "password": "Tr0ub4dor&3" }, "classifier": { "name" : "news20", "classCount": 20 }}
{ "auth": { "user" : "psmith", "password": "Tr0ub4dor&3" }, "classifier": { "name" : "news20", "classCount": 20 }}
{ "auth": { "user" : "psmith", "password": "Tr0ub4dor&3" }, "classifier": { "name" : "news20", "classCount": 20 }}
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
sealed trait Configcase class Value( value: String) extends Configcase class Section( children: Map[String, Config]) extends Config
val conf = Section(Map( "auth" -> Section(Map( "user" -> Value("psmith"), "password" -> Value("Tr0ub4dor&3") )), "classifier" -> Section(Map( "name" -> Value("news20"), "classCount" -> Value("20") ))))
val conf = Section(Map( "auth" -> Section(Map( "user" -> Value("psmith"), "password" -> Value("Tr0ub4dor&3") )), "classifier" -> Section(Map( "name" -> Value("news20"), "classCount" -> Value("20") ))))
val conf = Section(Map( "auth" -> Section(Map( "user" -> Value("psmith"), "password" -> Value("Tr0ub4dor&3") )), "classifier" -> Section(Map( "name" -> Value("news20"), "classCount" -> Value("20") ))))
val conf = Section(Map( "auth" -> Section(Map( "user" -> Value("psmith"), "password" -> Value("Tr0ub4dor&3") )), "classifier" -> Section(Map( "name" -> Value("news20"), "classCount" -> Value("20") ))))
val section = Prism.fromPartial[Config, Section]( setter = a => a, getter = { case a: Section => a })val value = Prism.fromPartial[Config, Value]( setter = a => a, getter = { case a: Value => a })
val section = Prism.fromPartial[Config, Section]( setter = a => a, getter = { case a: Section => a })val value = Prism.fromPartial[Config, Value]( setter = a => a, getter = { case a: Value => a })
val section = Prism.fromPartial[Config, Section]( setter = a => a, getter = { case a: Section => a })val value = Prism.fromPartial[Config, Value]( setter = a => a, getter = { case a: Value => a })
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
def sectionChild(name: String) = Optional[Section, Config]( setter = (a, s) => Section(s.children + (name -> a)), getter = s => s.children.get(name))
val identityOpt = Optional[Config, Config]( setter = (a, _) => a, getter = s => Some(s))
val identityOpt = Optional[Config, Config]( setter = (a, _) => a, getter = s => Some(s))
val identityOpt = Optional[Config, Config]( setter = (a, _) => a, getter = s => Some(s))
val identityOpt = Optional[Config, Config]( setter = (a, _) => a, getter = s => Some(s))
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
case class ConfigPath(current: Optional[Config, Config]) { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def child(name: String) = ConfigPath( composeOO( asSection, sectionChild(name) ) )}
val classifierName: Optional[Config, Value] = ConfigPath(identityOpt). child("classifier"). child("name"). asValue
val classifierName: Optional[Config, Value] = ConfigPath(identityOpt). child("classifier"). child("name"). asValue
val classifierName: Optional[Config, Value] = ConfigPath(identityOpt). child("classifier"). child("name"). asValue
val classifierName: Optional[Config, Value] = ConfigPath(identityOpt). child("classifier"). child("name"). asValue
val classifierName: Optional[Config, Value] = ConfigPath(identityOpt). child("classifier"). child("name"). asValue
val classifierName: Optional[Config, Value] = ConfigPath(identityOpt). child("classifier"). child("name"). asValue
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar
import scala.language.dynamicsobject UpCase extends Dynamic { def selectDynamic(missingMember: String): String = missingMember.toUpperCase}
UpCase.bar// res5: String = BAR
case class ConfigPath( current: Optional[Config, Config] ) extends Dynamic { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def selectDynamic(child: String) = ConfigPath( composeOO( asSection, sectionChild(child) ) )}
case class ConfigPath( current: Optional[Config, Config] ) extends Dynamic { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def selectDynamic(child: String) = ConfigPath( composeOO( asSection, sectionChild(child) ) )}
case class ConfigPath( current: Optional[Config, Config] ) extends Dynamic { val asValue = composeOP(current, value) val asSection = composeOP(current, section) def selectDynamic(child: String) = ConfigPath( composeOO( asSection, sectionChild(child) ) )}
val classifierName = ConfigPath(identityOpt). classifier. name. asValue
val classifierName = ConfigPath(identityOpt). classifier. name. asValue
val classifierName = ConfigPath(identityOpt). classifier. name. asValue
val classifierName = ConfigPath(identityOpt). classifier. name. asValue
val classifierName = ConfigPath(identityOpt). classifier. name. asValue
val classifierName = ConfigPath(identityOpt). classifier. name. asValue
val root = ConfigPath(identityOpt)
val classifierName = root. classifier. name. asValue
classifierName.get(conf)// res6: Option[Value] = Some(Value(news20))
Optics work not only with ADTs, but with any nested immutable data structure.
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 |