Skip to content

Instantly share code, notes, and snippets.

@kpmeen
Forked from jdegoes/IO.scala
Created August 11, 2016 16:39
Show Gist options
  • Save kpmeen/735b239b388d3d1441094162fec5d907 to your computer and use it in GitHub Desktop.
Save kpmeen/735b239b388d3d1441094162fec5d907 to your computer and use it in GitHub Desktop.
A pedagogical implementation of the IO monad in Scala in 14 LOC
case class IO[A](unsafePerformIO: () => A) {
def map[B](ab: A => B): IO[B] = IO(() => ab(unsafePerformIO()))
def flatMap[B](afb: A => IO[B]): IO[B] =IO(() => afb(unsafePerformIO()).unsafePerformIO())
def tryIO(ta: Throwable => A): IO[A] =
IO(() => IO.tryIO(unsafePerformIO()).unsafePerformIO() match {
case Left(t) => ta(t)
case Right(a) => a
})
}
object IO {
def point[A](a: => A): IO[A] = IO(() => a)
def tryIO[A](a: => A): IO[Either[Throwable, A]] =
IO(() => try { Right(a) } catch { case t : Throwable => Left(t) })
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment