From 0dc9f24cef4ea4e58afa59fab565e36796c0cb1d Mon Sep 17 00:00:00 2001 From: vlad Date: Fri, 31 Mar 2017 21:39:42 -0700 Subject: Logging clean up, Monadic execution utils --- src/main/scala/xyz/driver/core/execution.scala | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/scala/xyz/driver/core/execution.scala (limited to 'src/main/scala/xyz/driver/core/execution.scala') diff --git a/src/main/scala/xyz/driver/core/execution.scala b/src/main/scala/xyz/driver/core/execution.scala new file mode 100644 index 0000000..f27b905 --- /dev/null +++ b/src/main/scala/xyz/driver/core/execution.scala @@ -0,0 +1,45 @@ +package xyz.driver.core + +import scala.concurrent.{ExecutionContext, Future} +import scalaz.OptionT + +object execution { + + implicit class FutureOptionTExtensions[T](future: Future[T])(implicit executionContext: ExecutionContext) { + + def toOptionT: OptionT[Future, T] = + OptionT.optionT[Future](future.map(value => Option(value))) + + def returnUnit: Future[Unit] = + future.map(_ => Option(())) + + def returnUnitOpt: OptionT[Future, Unit] = + OptionT.optionT[Future](future.map(_ => Option(()))) + + def andEffect[E](effect: Future[E]): Future[T] = + for { + result <- future + _ <- effect + } yield result + + def andEffect[E](effect: OptionT[Future, E]): Future[T] = + andEffect(effect.run) + } + + def illegalState[T](message: String) = + failure(new IllegalStateException(message)) + + def illegalArgument[T](message: String) = + failure(new IllegalArgumentException(message)) + + def failure[T](throwable: Throwable) = + OptionT.optionT(Future.failed[Option[T]](throwable)) + + def collectOrNone[T, R](value: T)(f: PartialFunction[T, OptionT[Future, R]]): OptionT[Future, R] = + f.lift(value).getOrElse(OptionT.optionT(Future.successful(Option.empty[R]))) + + def collectOrDoNothing[T](value: T)(f: PartialFunction[T, OptionT[Future, Unit]]): OptionT[Future, Unit] = + f.lift(value).getOrElse(doNothing) + + val doNothing = OptionT.optionT(Future.successful(Option(()))) +} -- cgit v1.2.3