diff --git a/kernel/shared/src/main/scala/cats/effect/kernel/instances/GenSpawnInstances.scala b/kernel/shared/src/main/scala/cats/effect/kernel/instances/GenSpawnInstances.scala index 8ba75440c3..ae2f240b4a 100644 --- a/kernel/shared/src/main/scala/cats/effect/kernel/instances/GenSpawnInstances.scala +++ b/kernel/shared/src/main/scala/cats/effect/kernel/instances/GenSpawnInstances.scala @@ -16,7 +16,7 @@ package cats.effect.kernel.instances -import cats.{~>, Align, Applicative, CommutativeApplicative, Functor, Monad, Parallel} +import cats.{~>, Align, Applicative, CommutativeApplicative, Functor, Id, Monad, Parallel} import cats.data.Ior import cats.effect.kernel.{GenSpawn, ParallelF} import cats.implicits._ @@ -32,15 +32,9 @@ trait GenSpawnInstances { def monad: Monad[M] = M - def sequential: F ~> M = - new (F ~> M) { - def apply[A](fa: F[A]): M[A] = ParallelF.value[M, A](fa) - } + def sequential: F ~> M = GenSpawnInstances.cachedSequential.asInstanceOf[F ~> M] - def parallel: M ~> F = - new (M ~> F) { - def apply[A](ma: M[A]): F[A] = ParallelF[M, A](ma) - } + def parallel: M ~> F = GenSpawnInstances.cachedParallel.asInstanceOf[M ~> F] } implicit def commutativeApplicativeForParallelF[F[_], E]( @@ -91,3 +85,15 @@ trait GenSpawnInstances { } } + +private object GenSpawnInstances { + private val cachedSequential: ParallelF[Id, *] ~> Id = + new (ParallelF[Id, *] ~> Id) { + def apply[A](fa: ParallelF[Id, A]): Id[A] = ParallelF.value[Id, A](fa) + } + + private val cachedParallel: Id ~> ParallelF[Id, *] = + new (Id ~> ParallelF[Id, *]) { + def apply[A](ma: Id[A]): ParallelF[Id, A] = ParallelF[Id, A](ma) + } +}