Skip to content

Instantly share code, notes, and snippets.

@PavelZaytsev
Created December 2, 2018 09:16
Show Gist options
  • Save PavelZaytsev/80459ff617df60461c0a4be9d29ac85a to your computer and use it in GitHub Desktop.
Save PavelZaytsev/80459ff617df60461c0a4be9d29ac85a to your computer and use it in GitHub Desktop.
case class Reader[E, A](run: E => A)
object Reader {
def andThen[E, A, B, C](fa: A => Reader[E, B],
fb: B => Reader[E, C]): A => Reader[E, C] = {
input: A =>
val readerB: Reader[E, B] = fa(input)
Reader { x =>
val readerBResult: B = readerB.run(x)
fb(readerBResult).run(x)
}
}
def run[E, A]: Reader[E, A] => E => A = {
case Reader(runnable) =>
e =>
runnable(e)
}
def map[A, B, E](ra: Reader[E, A])(f: A => B): Reader[E, B] = {
Reader(_ => f(ra.run()))
}
def pure[E, A](a: A): Reader[E, A] = Reader(e => a)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment