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