Skip to content

Instantly share code, notes, and snippets.

@vega113
Created January 6, 2016 07:59
Show Gist options
  • Save vega113/82365782aa3ec74ea087 to your computer and use it in GitHub Desktop.
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 "
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