From f2191f61a7c1ae4ea56ad39dd083d38a826afc9b Mon Sep 17 00:00:00 2001 From: "Yang, Bo" Date: Thu, 3 Feb 2022 01:14:42 -0800 Subject: [PATCH] Add Dsl instances for ReaderT --- build.sbt | 2 ++ .../com/thoughtworks/dsl/domains/scalaz.scala | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index ec5083e7..46079ce2 100644 --- a/build.sbt +++ b/build.sbt @@ -190,6 +190,8 @@ lazy val `domains-scalaz` = Dsl, `macros-Reset` % Test, `keywords-Monadic`, + `keywords-Get`, + `keywords-Put`, `keywords-Return`, `keywords-TryCatch`, `keywords-TryFinally`, diff --git a/domains-scalaz/src/main/scala/com/thoughtworks/dsl/domains/scalaz.scala b/domains-scalaz/src/main/scala/com/thoughtworks/dsl/domains/scalaz.scala index e7a84cf9..6384f351 100644 --- a/domains-scalaz/src/main/scala/com/thoughtworks/dsl/domains/scalaz.scala +++ b/domains-scalaz/src/main/scala/com/thoughtworks/dsl/domains/scalaz.scala @@ -6,8 +6,16 @@ import com.thoughtworks.dsl.Dsl.!! import scala.language.higherKinds import scala.language.implicitConversions -import _root_.scalaz.{Applicative, Bind, Monad, MonadError, MonadTrans} -import com.thoughtworks.dsl.keywords.{Monadic, Return} +import _root_.scalaz.{ + Applicative, + Bind, + Kleisli, + Monad, + MonadError, + MonadTrans, + ReaderT +} +import com.thoughtworks.dsl.keywords.{Get, Monadic, Put, Return} import scala.util.control.Exception.Catcher import scala.util.control.NonFatal @@ -206,6 +214,11 @@ object scalaz extends scalaz.LowPriority0 { monadTrans.liftM(_) } + // ReaderT/Kleisli's type parameter order does not support partial unification for MonadTrans + given [E, F[_], A, B]: Dsl.Lift.OneStep[F[A], Kleisli[F, E, A]] = { fa => + Kleisli(_ => fa) + } + /** The [[Dsl]] instance that converts a [[domains.Monadic]] keyword to the * monad domain type then flatMap. This instance helps when the keyword * supports a domain `D` that can be lifted to the `F[A]`, while there is not @@ -222,4 +235,18 @@ object scalaz extends scalaz.LowPriority0 { ) } + given [E, F[_], A]: Dsl.Original[Get[E], ReaderT[E, F, A], E] = Dsl.Original { + (keyword, handler) => + ReaderT { e => + handler(e)(e) + } + } + + given [E, F[_], A]: Dsl.Original[Put[E], ReaderT[E, F, A], Unit] = + Dsl.Original { (keyword, handler) => + ReaderT { _ => + handler(())(Put.apply.flip(keyword)) + } + } + }