-
Notifications
You must be signed in to change notification settings - Fork 29
/
Monadic.scala
38 lines (33 loc) · 1.12 KB
/
Monadic.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.thoughtworks.dsl
package keywords
import Dsl.IsKeyword
import scala.language.higherKinds
import scala.language.implicitConversions
/** A keyword for extracting monadic value from the monadic expression [[fa]].
*
* @see
* [[com.thoughtworks.dsl.domains.cats]] for using this [[Monadic]] keyword
* with [[cats.Monad]].
* @see
* [[com.thoughtworks.dsl.domains.scalaz]] for using this [[Monadic]] keyword
* with [[scalaz.Monad]].
* @todo
* [[Monadic]] should be a [[scala.AnyVal]] after
* [[https://github.com/scala/bug/issues/10595]] is resolved.
*/
opaque type Monadic[+FA] <: Dsl.Keyword.Opaque =
Dsl.Keyword.Opaque.Of[FA]
@inline def Monadic[FA](using
dummyImplicit: DummyImplicit = DummyImplicit.dummyImplicit
): FA =:= Monadic[FA] = Dsl.Keyword.Opaque.Of
object Monadic {
extension [FA, F[_], A](inline fa: FA)(using
inline notKeyword: util.NotGiven[
FA <:< Dsl.Keyword
],
inline asFA: FA <:< F[A]
)
transparent inline def unary_! : A =
Dsl.shift[Monadic[FA], A](Monadic[FA](fa)): A
given [FA <: F[A], F[_], A]: IsKeyword[Monadic[FA], A] with {}
}