Created
January 1, 2017 13:30
-
-
Save Fristi/747de1ada708ea2ae1371e2e7c26facc to your computer and use it in GitHub Desktop.
Accessing elements via optics in a Map[String, Any]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package maps | |
import monocle._ | |
import monocle.std.map._ | |
import monocle.function.all._ | |
import scala.reflect.ClassTag | |
object Test extends App { | |
def get[A](key: String) = at[Map[String, Any], String, Option[Any]](key) | |
def as[A](implicit CT: ClassTag[A]) = | |
Optional[Option[Any], A] { | |
case Some(x : A) => Some(x) | |
} { x => _ => Some(x) } | |
private val name = get("name") ^|-? as[String] | |
private val age = get("age") ^|-? as[Int] | |
val f1 = name.set("Mark") | |
val f2 = age.set(2) | |
println(as[Int].set(2).apply(None)) | |
val composed = f1 andThen f2 | |
val map = composed(Map.empty) | |
println(map) | |
println(name.getOption(map)) | |
println(age.getOption(map)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment