From fbf25ed06bf87af2d139ae58f208d9bb5b299e03 Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 12 Apr 2017 16:54:02 -0700 Subject: PDW-598 Getting rid of log wrapper --- src/main/scala/xyz/driver/core/time.scala | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/main/scala/xyz/driver/core/time.scala') diff --git a/src/main/scala/xyz/driver/core/time.scala b/src/main/scala/xyz/driver/core/time.scala index ed5eb11..63a6fa4 100644 --- a/src/main/scala/xyz/driver/core/time.scala +++ b/src/main/scala/xyz/driver/core/time.scala @@ -2,6 +2,7 @@ package xyz.driver.core import java.text.SimpleDateFormat import java.util._ +import java.util.concurrent.TimeUnit import scala.concurrent.duration._ @@ -27,6 +28,8 @@ object time { def advanceBy(duration: Duration): Time = Time(millis + duration.toMillis) + def durationTo(anotherTime: Time): Duration = Duration.apply(anotherTime.millis - millis, TimeUnit.MILLISECONDS) + def toDate(timezone: TimeZone): date.Date = { val cal = Calendar.getInstance(timezone) cal.setTimeInMillis(millis) -- cgit v1.2.3 From 2d0aba0eaf360c521d9bcfbf48dc748b777301d2 Mon Sep 17 00:00:00 2001 From: vlad Date: Thu, 13 Apr 2017 10:22:09 -0700 Subject: PDW-598 PR comments, refinement for OptionT utils --- src/main/scala/xyz/driver/core/core.scala | 22 ++++++++++- src/main/scala/xyz/driver/core/database/Dal.scala | 5 ++- src/main/scala/xyz/driver/core/execution.scala | 45 ----------------------- src/main/scala/xyz/driver/core/time.scala | 2 + 4 files changed, 27 insertions(+), 47 deletions(-) delete mode 100644 src/main/scala/xyz/driver/core/execution.scala (limited to 'src/main/scala/xyz/driver/core/time.scala') diff --git a/src/main/scala/xyz/driver/core/core.scala b/src/main/scala/xyz/driver/core/core.scala index 3e77c1f..1babd91 100644 --- a/src/main/scala/xyz/driver/core/core.scala +++ b/src/main/scala/xyz/driver/core/core.scala @@ -1,6 +1,6 @@ package xyz.driver -import scalaz.Equal +import scalaz.{Equal, Monad, OptionT} package object core { @@ -25,6 +25,26 @@ package object core { private[core] trait Tagged[+V, +Tag] } type @@[+V, +Tag] = V with tagging.Tagged[V, Tag] + + implicit class OptionTExtensions[H[_]: Monad, T](optionTValue: OptionT[H, T]) { + + def returnUnit: H[Unit] = optionTValue.fold[Unit](_ => (), ()) + + def continueIgnoringNone: OptionT[H, Unit] = + optionTValue.map(_ => ()).orElse(OptionT.some[H, Unit](())) + } + + implicit class MonadicExtensions[H[_]: Monad, T](monadicValue: H[T]) { + private implicit val monadT = implicitly[Monad[H]] + + def returnUnit: H[Unit] = monadT(monadicValue)(_ => ()) + + def toOptionT: OptionT[H, T] = + OptionT.optionT[H](monadT(monadicValue)(value => Option(value))) + + def toUnitOptionT: OptionT[H, Unit] = + OptionT.optionT[H](monadT(monadicValue)(_ => Option(()))) + } } package core { diff --git a/src/main/scala/xyz/driver/core/database/Dal.scala b/src/main/scala/xyz/driver/core/database/Dal.scala index 0adb4d7..55766db 100644 --- a/src/main/scala/xyz/driver/core/database/Dal.scala +++ b/src/main/scala/xyz/driver/core/database/Dal.scala @@ -3,8 +3,8 @@ package xyz.driver.core.database import slick.lifted.AbstractTable import scala.concurrent.{ExecutionContext, Future} +import scalaz.{ListT, Monad, OptionT} import scalaz.std.scalaFuture._ -import scalaz.{ListT, Monad} trait Dal { type T[D] @@ -13,6 +13,9 @@ trait Dal { def execute[D](operations: T[D]): Future[D] def noAction[V](v: V): T[V] def customAction[R](action: => Future[R]): T[R] + + def customAction[R](action: => OptionT[Future, R]): OptionT[T, R] = + OptionT[T, R](customAction(action.run)) } class FutureDal(executionContext: ExecutionContext) extends Dal { diff --git a/src/main/scala/xyz/driver/core/execution.scala b/src/main/scala/xyz/driver/core/execution.scala deleted file mode 100644 index 0cf92fd..0000000 --- a/src/main/scala/xyz/driver/core/execution.scala +++ /dev/null @@ -1,45 +0,0 @@ -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): OptionT[Future, T] = - failure[T](new IllegalStateException(message)) - - def illegalArgument[T](message: String): OptionT[Future, T] = - failure[T](new IllegalArgumentException(message)) - - def failure[T](throwable: Throwable): OptionT[Future, T] = - 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(()))) -} diff --git a/src/main/scala/xyz/driver/core/time.scala b/src/main/scala/xyz/driver/core/time.scala index 63a6fa4..e1a315d 100644 --- a/src/main/scala/xyz/driver/core/time.scala +++ b/src/main/scala/xyz/driver/core/time.scala @@ -30,6 +30,8 @@ object time { def durationTo(anotherTime: Time): Duration = Duration.apply(anotherTime.millis - millis, TimeUnit.MILLISECONDS) + def durationFrom(anotherTime: Time): Duration = Duration.apply(millis - anotherTime.millis, TimeUnit.MILLISECONDS) + def toDate(timezone: TimeZone): date.Date = { val cal = Calendar.getInstance(timezone) cal.setTimeInMillis(millis) -- cgit v1.2.3