Skip to content

Instantly share code, notes, and snippets.

@D4v1X
Last active June 12, 2019 23:53
Show Gist options
  • Save D4v1X/fd4d5936e0f6ed7bba149925e272658b to your computer and use it in GitHub Desktop.
Save D4v1X/fd4d5936e0f6ed7bba149925e272658b to your computer and use it in GitHub Desktop.
Test with Scala Cats IO
import java.time.Instant
import java.util.concurrent.Executors
import cats.effect._
import cats.syntax.all._
import scala.concurrent.duration._
import scala.concurrent.{ExecutionContext, ExecutionContextExecutor}
import scala.util.{Failure, Success}
object IOMain {
private val exBlockingFileIO = ExecutionContext.fromExecutor(Executors.newCachedThreadPool())
private val exMain: ExecutionContextExecutor = ExecutionContext.global
implicit val csMain: ContextShift[IO] = IO.contextShift(exMain)
// Needed for `IO.sleep`
implicit val timer: Timer[IO] = IO.timer(exMain)
def task(): IO[Unit] =
for {
_ <- IO(println(s"${Instant.now()} - start task!"))
_ <- IO.sleep(2.second)
_ <- IO(println(s"${Instant.now()} - finished task!"))
} yield ()
def program(args: List[String]): IO[Unit] =
for {
_ <- IO(println(s"${Instant.now()} - Sleep!"))
fiber <- task().start
_ <- IO(println(s"${Instant.now()} - Wake up!"))
result <- IO.pure(fiber)
} yield result
def main(args: Array[String]): Unit =
program(args.toList)
.unsafeToFuture()
.onComplete {
case Failure(_) => println(s"${Instant.now()} - ERROR!")
case Success(_) => println(s"${Instant.now()} - OK!")
}(exMain)
def run(args: List[String]): IO[ExitCode] =
program(args).as(ExitCode.Success)
def mai2(args: Array[String]): Unit =
run(args.toList).runAsync(_ => IO(())).unsafeRunSync()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment