Skip to content
Snippets Groups Projects
Reader.scala 737 B
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)))
  }
}