Created
January 6, 2016 07:59
-
-
Save vega113/82365782aa3ec74ea087 to your computer and use it in GitHub Desktop.
Complementary code for introduction of the Reader in "Dead simple dependency injection video https://youtu.be/ZasXwtTRkio "
This file contains hidden or 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 me.reader | |
/** | |
* Created by yuri.zelikov on 1/6/2016. | |
*/ | |
case class Reader[C, A](g: C => A) { | |
def apply(c: C) = g(c) | |
def map[B](f: A => B): Reader[C, B] = { c: C => | |
f(g(c)) | |
} | |
def flatMap[B](f: A => Reader[C, B]): Reader[C, B] = { c: C => | |
f(g(c))(c) | |
} | |
} | |
object Reader { | |
implicit def reader[A, B](f: A => B): Reader[A, B] = Reader(f) | |
def pure[C, A](a: A): Reader[C, A] = { c: C => | |
a | |
} | |
} | |
trait KeyValueStore { | |
def put(key: String, value: String): Unit | |
def get(key: String): String | |
def delete(key: String): Unit | |
} | |
class StrKeyValueStore extends KeyValueStore { | |
var store: Map[String, String] = Map() | |
override def put(key: String, value: String): Unit = { | |
store = Map[String, String]() + (key -> value) ++ store | |
} | |
override def get(key: String): String = store(key) | |
override def delete(key: String): Unit = { | |
store = store - key | |
} | |
} | |
object RunReader { | |
type KvsReader[A] = Reader[KeyValueStore, A] | |
def modify[T](k: String, f: String => T): KvsReader[T] = { | |
val v: KvsReader[String] = (kvs: KeyValueStore) => kvs.get(k) | |
v.map(f) | |
} | |
// get error: value filter is not a member of me.reader.KeyValueStore | |
// def modify2[A](k: String, f: String => String): KvsReader[A] = { | |
// for { | |
// v: String <- (kvs: KeyValueStore) => kvs.get(k) | |
// } yield f(v) | |
// } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment