1
+ trait Monoid [A ]
2
+ trait Semigroup [A ]
3
+ trait Applicative [F [_]]
4
+
5
+ trait OptionT [F [_], A ]
6
+ trait EitherT [F [_], A , B ]
7
+ trait IorT [F [_], A , B ]
8
+ trait WriterT [F [_], L , V ]
9
+ trait Kleisli [F [_], A , B ]
10
+
11
+ final class ApplicativeIdOps [A ](private val a : A ) extends AnyVal {
12
+ def pure [F [_]](implicit F : Applicative [F ]): F [A ] = ???
13
+ }
14
+
15
+ object ApplicativeSyntax {
16
+ implicit final def syntaxApplicativeId [A ](a : A ): ApplicativeIdOps [A ] = new ApplicativeIdOps [A ](a)
17
+ }
18
+
19
+ trait Sync [F [_]]
20
+
21
+ object Sync {
22
+ implicit def syncForOptionT [F [_]](implicit F0 : Sync [F ]): Sync [[X ] =>> OptionT [F , X ]] = ???
23
+ implicit def syncForEitherT [F [_], E ](implicit F0 : Sync [F ]): Sync [[X ] =>> EitherT [F , E , X ]] = ???
24
+ implicit def syncForIorT [F [_], L ](implicit F0 : Sync [F ], L0 : Semigroup [L ]): Sync [[X ] =>> IorT [F , L , X ]] = ???
25
+ implicit def syncForWriterT [F [_], L ](implicit F0 : Sync [F ], L0 : Monoid [L ]): Sync [[X ] =>> WriterT [F , L , X ]] = ???
26
+ implicit def syncForKleisli [F [_], R ](implicit F0 : Sync [F ]): Sync [[X ] =>> Kleisli [F , R , X ]] = ???
27
+ }
28
+
29
+ trait Async [F [_]] extends Sync [F ]
30
+
31
+ object Async {
32
+ implicit def asyncForOptionT [F [_]](implicit F0 : Async [F ]): Async [[X ] =>> OptionT [F , X ]] = ???
33
+ implicit def asyncForEitherT [F [_], E ](implicit F0 : Async [F ]): Async [[X ] =>> EitherT [F , E , X ]] = ???
34
+ implicit def asyncForIorT [F [_], L ](implicit F0 : Async [F ], L0 : Semigroup [L ]): Async [[X ] =>> IorT [F , L , X ]] = ???
35
+ implicit def asyncForWriterT [F [_], L ](implicit F0 : Async [F ], L0 : Monoid [L ]): Async [[X ] =>> WriterT [F , L , X ]] = ???
36
+ implicit def asyncForKleisli [F [_], R ](implicit F0 : Async [F ]): Async [[X ] =>> Kleisli [F , R , X ]] = ???
37
+ }
38
+
39
+ trait Concurrent [F [_], E ] extends Applicative [F ]
40
+
41
+ trait Ref [F [_], A ]
42
+
43
+ object Ref {
44
+ trait Make [F [_]]
45
+ object Make extends MakeInstances
46
+
47
+ trait MakeInstances extends MakeLowPriorityInstances {
48
+ implicit def concurrentInstance [F [_]](implicit F : Concurrent [F , _]): Make [F ] = ???
49
+ }
50
+
51
+ trait MakeLowPriorityInstances {
52
+ implicit def syncInstance [F [_]](implicit F : Sync [F ]): Make [F ] = ???
53
+ }
54
+
55
+ def of [F [_], A ](a : A )(implicit mk : Make [F ]): F [Ref [F , A ]] = ???
56
+ }
57
+
58
+
59
+ class Resource [F [_], A ] {
60
+ import ApplicativeSyntax ._
61
+
62
+ implicit def asyncForResource [F [_]](implicit F0 : Async [F ]): Async [[X ] =>> Resource [F , X ]] = ???
63
+
64
+ def parZip (implicit F : Concurrent [F , Throwable ]) = {
65
+ Ref .of /* [F, (F[Unit], F[Unit])]*/ (().pure[F ] -> ().pure[F ])
66
+ ()
67
+ }
68
+ }
0 commit comments