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))) } }