Skip to content
Snippets Groups Projects
Forked from intro-to-fp / short-exercises
3 commits behind the upstream repository.
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)))