Skip to content

Instantly share code, notes, and snippets.

@PavelZaytsev
Last active December 2, 2018 00:53
Show Gist options
  • Save PavelZaytsev/dc8bcfcaa50faf825901140c71b266a8 to your computer and use it in GitHub Desktop.
Save PavelZaytsev/dc8bcfcaa50faf825901140c71b266a8 to your computer and use it in GitHub Desktop.
case class Reader[E, A](run: E => A)
object Reader {
def >==>[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)
flatMap(readerB)(fb)
}
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 flatMap[A, B, E](ra: Reader[E, A])(f: A => Reader[E, B]): Reader[E, B] = {
Reader { e =>
val a: A = ra.run(e)
val readerB: Reader[E, B] = f(a)
readerB.run(e)
}
}
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