Forked from
intro-to-fp / short-exercises
3 commits behind the upstream repository.
-
Alexander Gehrke authoredAlexander Gehrke authored
Reader.scala 685 B
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)
given readerM[R]: Monad[[a] =>> Reader[R, a]] with
def pure[A](a: A): Reader[R, A] = Reader(_ => a)
extension [A](fa: Reader[R, A])
def flatMap[B](f: A => Reader[R, B]): Reader[R, B] = Reader(in => {
val a = fa.run(in)
f(a).run(in)
})
override def map2[B, C](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[B](f: A => B): Reader[R, B] = Reader(in => f(fa.run(in)))