Skip to content

Commit b05e660

Browse files
authored
Merge pull request #2809 from ybasket/refine-derived-type-classes
Refine derived type classes
2 parents e95992b + e9a9b2f commit b05e660

File tree

6 files changed

+422
-74
lines changed

6 files changed

+422
-74
lines changed

kernel/shared/src/main/scala/cats/effect/kernel/GenConcurrent.scala

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,37 +149,90 @@ object GenConcurrent {
149149

150150
implicit def genConcurrentForOptionT[F[_], E](
151151
implicit F0: GenConcurrent[F, E]): GenConcurrent[OptionT[F, *], E] =
152+
F0 match {
153+
case async: Async[F @unchecked] =>
154+
Async.asyncForOptionT[F](async)
155+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
156+
GenTemporal.instantiateGenTemporalForOptionT[F, E](temporal)
157+
case concurrent =>
158+
instantiateGenConcurrentForOptionT(concurrent)
159+
}
160+
161+
private[kernel] def instantiateGenConcurrentForOptionT[F[_], E](
162+
F0: GenConcurrent[F, E]): OptionTGenConcurrent[F, E] =
152163
new OptionTGenConcurrent[F, E] {
153164
override implicit protected def F: GenConcurrent[F, E] = F0
154165
}
155166

156167
implicit def genConcurrentForEitherT[F[_], E0, E](
157168
implicit F0: GenConcurrent[F, E]): GenConcurrent[EitherT[F, E0, *], E] =
169+
F0 match {
170+
case async: Async[F @unchecked] =>
171+
Async.asyncForEitherT[F, E0](async)
172+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
173+
GenTemporal.instantiateGenTemporalForEitherT[F, E0, E](temporal)
174+
case concurrent =>
175+
instantiateGenConcurrentForEitherT(concurrent)
176+
}
177+
178+
private[kernel] def instantiateGenConcurrentForEitherT[F[_], E0, E](
179+
F0: GenConcurrent[F, E]): EitherTGenConcurrent[F, E0, E] =
158180
new EitherTGenConcurrent[F, E0, E] {
159181
override implicit protected def F: GenConcurrent[F, E] = F0
160182
}
161183

162184
implicit def genConcurrentForKleisli[F[_], R, E](
163185
implicit F0: GenConcurrent[F, E]): GenConcurrent[Kleisli[F, R, *], E] =
186+
F0 match {
187+
case async: Async[F @unchecked] =>
188+
Async.asyncForKleisli[F, R](async)
189+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
190+
GenTemporal.instantiateGenTemporalForKleisli[F, R, E](temporal)
191+
case concurrent =>
192+
instantiateGenConcurrentForKleisli(concurrent)
193+
}
194+
195+
private[kernel] def instantiateGenConcurrentForKleisli[F[_], R, E](
196+
F0: GenConcurrent[F, E]): KleisliGenConcurrent[F, R, E] =
164197
new KleisliGenConcurrent[F, R, E] {
165198
override implicit protected def F: GenConcurrent[F, E] = F0
166199
}
167200

168201
implicit def genConcurrentForIorT[F[_], L, E](
169202
implicit F0: GenConcurrent[F, E],
170203
L0: Semigroup[L]): GenConcurrent[IorT[F, L, *], E] =
204+
F0 match {
205+
case async: Async[F @unchecked] =>
206+
Async.asyncForIorT[F, L](async, L0)
207+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
208+
GenTemporal.instantiateGenTemporalForIorT[F, L, E](temporal)
209+
case concurrent =>
210+
instantiateGenConcurrentForIorT(concurrent)
211+
}
212+
213+
private[kernel] def instantiateGenConcurrentForIorT[F[_], L, E](F0: GenConcurrent[F, E])(
214+
implicit L0: Semigroup[L]): IorTGenConcurrent[F, L, E] =
171215
new IorTGenConcurrent[F, L, E] {
172216
override implicit protected def F: GenConcurrent[F, E] = F0
173-
174217
override implicit protected def L: Semigroup[L] = L0
175218
}
176219

177220
implicit def genConcurrentForWriterT[F[_], L, E](
178221
implicit F0: GenConcurrent[F, E],
179222
L0: Monoid[L]): GenConcurrent[WriterT[F, L, *], E] =
223+
F0 match {
224+
case async: Async[F @unchecked] =>
225+
Async.asyncForWriterT[F, L](async, L0)
226+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
227+
GenTemporal.instantiateGenTemporalForWriterT[F, L, E](temporal)
228+
case concurrent =>
229+
instantiateGenConcurrentForWriterT(concurrent)
230+
}
231+
232+
private[kernel] def instantiateGenConcurrentForWriterT[F[_], L, E](F0: GenConcurrent[F, E])(
233+
implicit L0: Monoid[L]): WriterTGenConcurrent[F, L, E] =
180234
new WriterTGenConcurrent[F, L, E] {
181235
override implicit protected def F: GenConcurrent[F, E] = F0
182-
183236
override implicit protected def L: Monoid[L] = L0
184237
}
185238

kernel/shared/src/main/scala/cats/effect/kernel/GenSpawn.scala

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -431,42 +431,100 @@ object GenSpawn {
431431

432432
implicit def genSpawnForOptionT[F[_], E](
433433
implicit F0: GenSpawn[F, E]): GenSpawn[OptionT[F, *], E] =
434-
new OptionTGenSpawn[F, E] {
434+
F0 match {
435+
case async: Async[F @unchecked] =>
436+
Async.asyncForOptionT[F](async)
437+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
438+
GenTemporal.instantiateGenTemporalForOptionT[F, E](temporal)
439+
case concurrent: GenConcurrent[F @unchecked, E @unchecked] =>
440+
GenConcurrent.instantiateGenConcurrentForOptionT[F, E](concurrent)
441+
case spawn =>
442+
instantiateGenSpawnForOptionT(spawn)
443+
}
435444

445+
private[kernel] def instantiateGenSpawnForOptionT[F[_], E](
446+
F0: GenSpawn[F, E]): OptionTGenSpawn[F, E] =
447+
new OptionTGenSpawn[F, E] {
436448
override implicit protected def F: GenSpawn[F, E] = F0
437449
}
438450

439451
implicit def genSpawnForEitherT[F[_], E0, E](
440452
implicit F0: GenSpawn[F, E]): GenSpawn[EitherT[F, E0, *], E] =
441-
new EitherTGenSpawn[F, E0, E] {
453+
F0 match {
454+
case async: Async[F @unchecked] =>
455+
Async.asyncForEitherT[F, E0](async)
456+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
457+
GenTemporal.instantiateGenTemporalForEitherT[F, E0, E](temporal)
458+
case concurrent: GenConcurrent[F @unchecked, E @unchecked] =>
459+
GenConcurrent.instantiateGenConcurrentForEitherT[F, E0, E](concurrent)
460+
case spawn =>
461+
instantiateGenSpawnForEitherT(spawn)
462+
}
442463

464+
private[kernel] def instantiateGenSpawnForEitherT[F[_], E0, E](
465+
F0: GenSpawn[F, E]): EitherTGenSpawn[F, E0, E] =
466+
new EitherTGenSpawn[F, E0, E] {
443467
override implicit protected def F: GenSpawn[F, E] = F0
444468
}
445469

446470
implicit def genSpawnForKleisli[F[_], R, E](
447471
implicit F0: GenSpawn[F, E]): GenSpawn[Kleisli[F, R, *], E] =
448-
new KleisliGenSpawn[F, R, E] {
472+
F0 match {
473+
case async: Async[F @unchecked] =>
474+
Async.asyncForKleisli[F, R](async)
475+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
476+
GenTemporal.instantiateGenTemporalForKleisli[F, R, E](temporal)
477+
case concurrent: GenConcurrent[F @unchecked, E @unchecked] =>
478+
GenConcurrent.instantiateGenConcurrentForKleisli[F, R, E](concurrent)
479+
case spawn =>
480+
instantiateGenSpawnForKleisli(spawn)
481+
}
449482

483+
private[kernel] def instantiateGenSpawnForKleisli[F[_], R, E](
484+
F0: GenSpawn[F, E]): KleisliGenSpawn[F, R, E] =
485+
new KleisliGenSpawn[F, R, E] {
450486
override implicit protected def F: GenSpawn[F, E] = F0
451487
}
452488

453489
implicit def genSpawnForIorT[F[_], L, E](
454490
implicit F0: GenSpawn[F, E],
455491
L0: Semigroup[L]): GenSpawn[IorT[F, L, *], E] =
456-
new IorTGenSpawn[F, L, E] {
492+
F0 match {
493+
case async: Async[F @unchecked] =>
494+
Async.asyncForIorT[F, L](async, L0)
495+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
496+
GenTemporal.instantiateGenTemporalForIorT[F, L, E](temporal)
497+
case concurrent: GenConcurrent[F @unchecked, E @unchecked] =>
498+
GenConcurrent.instantiateGenConcurrentForIorT[F, L, E](concurrent)
499+
case spawn =>
500+
instantiateGenSpawnForIorT(spawn)
501+
}
457502

503+
private[kernel] def instantiateGenSpawnForIorT[F[_], L, E](F0: GenSpawn[F, E])(
504+
implicit L0: Semigroup[L]): IorTGenSpawn[F, L, E] =
505+
new IorTGenSpawn[F, L, E] {
458506
override implicit protected def F: GenSpawn[F, E] = F0
459-
460507
override implicit protected def L: Semigroup[L] = L0
461508
}
462509

463510
implicit def genSpawnForWriterT[F[_], L, E](
464511
implicit F0: GenSpawn[F, E],
465512
L0: Monoid[L]): GenSpawn[WriterT[F, L, *], E] =
466-
new WriterTGenSpawn[F, L, E] {
513+
F0 match {
514+
case async: Async[F @unchecked] =>
515+
Async.asyncForWriterT[F, L](async, L0)
516+
case temporal: GenTemporal[F @unchecked, E @unchecked] =>
517+
GenTemporal.instantiateGenTemporalForWriterT[F, L, E](temporal)
518+
case concurrent: GenConcurrent[F @unchecked, E @unchecked] =>
519+
GenConcurrent.instantiateGenConcurrentForWriterT[F, L, E](concurrent)
520+
case spawn =>
521+
instantiateGenSpawnForWriterT(spawn)
522+
}
467523

524+
private[kernel] def instantiateGenSpawnForWriterT[F[_], L, E](F0: GenSpawn[F, E])(
525+
implicit L0: Monoid[L]): WriterTGenSpawn[F, L, E] =
526+
new WriterTGenSpawn[F, L, E] {
468527
override implicit protected def F: GenSpawn[F, E] = F0
469-
470528
override implicit protected def L: Monoid[L] = L0
471529
}
472530

kernel/shared/src/main/scala/cats/effect/kernel/GenTemporal.scala

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,37 +144,80 @@ object GenTemporal {
144144

145145
implicit def genTemporalForOptionT[F[_], E](
146146
implicit F0: GenTemporal[F, E]): GenTemporal[OptionT[F, *], E] =
147+
F0 match {
148+
case async: Async[F @unchecked] =>
149+
Async.asyncForOptionT[F](async)
150+
case temporal =>
151+
instantiateGenTemporalForOptionT(temporal)
152+
}
153+
154+
private[kernel] def instantiateGenTemporalForOptionT[F[_], E](
155+
F0: GenTemporal[F, E]): OptionTTemporal[F, E] =
147156
new OptionTTemporal[F, E] {
148157
override implicit protected def F: GenTemporal[F, E] = F0
149158
}
150159

151160
implicit def genTemporalForEitherT[F[_], E0, E](
152161
implicit F0: GenTemporal[F, E]): GenTemporal[EitherT[F, E0, *], E] =
162+
F0 match {
163+
case async: Async[F @unchecked] =>
164+
Async.asyncForEitherT[F, E0](async)
165+
case temporal =>
166+
instantiateGenTemporalForEitherT(temporal)
167+
}
168+
169+
private[kernel] def instantiateGenTemporalForEitherT[F[_], E0, E](
170+
F0: GenTemporal[F, E]): EitherTTemporal[F, E0, E] =
153171
new EitherTTemporal[F, E0, E] {
154172
override implicit protected def F: GenTemporal[F, E] = F0
155173
}
156174

157175
implicit def genTemporalForKleisli[F[_], R, E](
158176
implicit F0: GenTemporal[F, E]): GenTemporal[Kleisli[F, R, *], E] =
177+
F0 match {
178+
case async: Async[F @unchecked] =>
179+
Async.asyncForKleisli[F, R](async)
180+
case temporal =>
181+
instantiateGenTemporalForKleisli(temporal)
182+
}
183+
184+
private[kernel] def instantiateGenTemporalForKleisli[F[_], R, E](
185+
F0: GenTemporal[F, E]): KleisliTemporal[F, R, E] =
159186
new KleisliTemporal[F, R, E] {
160187
override implicit protected def F: GenTemporal[F, E] = F0
161188
}
162189

163190
implicit def genTemporalForIorT[F[_], L, E](
164191
implicit F0: GenTemporal[F, E],
165192
L0: Semigroup[L]): GenTemporal[IorT[F, L, *], E] =
193+
F0 match {
194+
case async: Async[F @unchecked] =>
195+
Async.asyncForIorT[F, L](async, L0)
196+
case temporal =>
197+
instantiateGenTemporalForIorT(temporal)
198+
}
199+
200+
private[kernel] def instantiateGenTemporalForIorT[F[_], L, E](F0: GenTemporal[F, E])(
201+
implicit L0: Semigroup[L]): IorTTemporal[F, L, E] =
166202
new IorTTemporal[F, L, E] {
167203
override implicit protected def F: GenTemporal[F, E] = F0
168-
169204
override implicit protected def L: Semigroup[L] = L0
170205
}
171206

172207
implicit def genTemporalForWriterT[F[_], L, E](
173208
implicit F0: GenTemporal[F, E],
174209
L0: Monoid[L]): GenTemporal[WriterT[F, L, *], E] =
210+
F0 match {
211+
case async: Async[F @unchecked] =>
212+
Async.asyncForWriterT[F, L](async, L0)
213+
case temporal =>
214+
instantiateGenTemporalForWriterT(temporal)
215+
}
216+
217+
private[kernel] def instantiateGenTemporalForWriterT[F[_], L, E](F0: GenTemporal[F, E])(
218+
implicit L0: Monoid[L]): WriterTTemporal[F, L, E] =
175219
new WriterTTemporal[F, L, E] {
176220
override implicit protected def F: GenTemporal[F, E] = F0
177-
178221
override implicit protected def L: Monoid[L] = L0
179222
}
180223

0 commit comments

Comments
 (0)