Newer
Older
package readerwriter.internal
import applicative.Monad
case class Reader[R, A](run: R => A)
object Reader {
def ask[R]: Reader[R, R] = Reader(x => x)
implicit def readerM[R]: Monad[Reader[R, ?]] = new Monad[Reader[R, ?]] {
override def flatMap[A, B](fa: Reader[R, A])(f: A => Reader[R, B]): Reader[R, B] = Reader(in => {
val a = fa.run(in)
f(a).run(in)
})
override def unit[A](a: A): Reader[R, A] = Reader(_ => a)
override def map2[A, B, C](fa: Reader[R, A], fb: Reader[R, B])(f: (A, B) => C): Reader[R, C] = Reader(in => {
val a = fa.run(in)
val b = fb.run(in)
f(a, b)
})
override def map[A, B](fa: Reader[R, A])(f: A => B): Reader[R, B] = Reader(in => f(fa.run(in)))
}
}