From 63a91fb5b041d70157989d8ab5c2286fafbf50d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Miguel=20Mej=C3=ADa=20Su=C3=A1rez?= Date: Sat, 10 Jul 2021 12:02:39 -0500 Subject: [PATCH] WIP Adding the Parallel instance for Eval --- .../cats/effect/instances/AllInstances.scala | 2 +- .../scala/cats/effect/instances/ParEval.scala | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 core/shared/src/main/scala/cats/effect/instances/ParEval.scala diff --git a/core/shared/src/main/scala/cats/effect/instances/AllInstances.scala b/core/shared/src/main/scala/cats/effect/instances/AllInstances.scala index 8e499cd00e..a9d7d8e88f 100644 --- a/core/shared/src/main/scala/cats/effect/instances/AllInstances.scala +++ b/core/shared/src/main/scala/cats/effect/instances/AllInstances.scala @@ -17,4 +17,4 @@ package cats.effect package instances -trait AllInstances extends kernel.instances.GenSpawnInstances +trait AllInstances extends kernel.instances.GenSpawnInstances with ParEval diff --git a/core/shared/src/main/scala/cats/effect/instances/ParEval.scala b/core/shared/src/main/scala/cats/effect/instances/ParEval.scala new file mode 100644 index 0000000000..9d602e4852 --- /dev/null +++ b/core/shared/src/main/scala/cats/effect/instances/ParEval.scala @@ -0,0 +1,48 @@ +/* + * Copyright 2020-2021 Typelevel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package cats.effect.instances + +import cats.{Applicative, Eval, Monad, Parallel, ~>} +import cats.arrow.FunctionK +import cats.effect.IO +import cats.effect.kernel.Par.ParallelF +import cats.effect.unsafe.implicits.global + +trait ParEval { + implicit final val parEvalInstance: Parallel[Eval] = + new Parallel[Eval] { + override final type F[x] = IO.Par[x] + + override final val applicative: Applicative[F] = + all.commutativeApplicativeForParallelF[IO, Throwable] + + override final val monad: Monad[Eval] = + Eval.catsBimonadForEval + + override final val sequential: IO.Par ~> Eval = + new FunctionK[IO.Par, Eval] { + override final def apply[A](ioPar: IO.Par[A]): Eval[A] = + Eval.later(ParallelF.value(ioPar).unsafeRunSync()) + } + + override final val parallel: Eval ~> IO.Par = + new FunctionK[Eval, IO.Par] { + override final def apply[A](eval: Eval[A]): IO.Par[A] = + ParallelF(IO(eval.value)) + } + } +}