/
NoneSafe.scala
36 lines (31 loc) · 1.01 KB
/
NoneSafe.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
package com.thoughtworks.dsl
package keywords
import com.thoughtworks.dsl.Dsl.IsKeyword
import scala.language.implicitConversions
opaque type NoneSafe[+A] <: Dsl.Keyword.Opaque =
Dsl.Keyword.Opaque.Of[Option[A]]
def NoneSafe[A](using
dummyImplicit: DummyImplicit = DummyImplicit.dummyImplicit
): Option[A] =:= NoneSafe[A] = Dsl.Keyword.Opaque.Of
object NoneSafe {
given [A]: IsKeyword[NoneSafe[A], A] with {}
given [A, Domain](using
continueDsl: Dsl.Searching[Return[None.type], Domain, Nothing]
): Dsl.Original[NoneSafe[A], Domain, A] = Dsl.Original[Option[A], Domain, A] {
(keyword: Option[A], handler: A => Domain) =>
keyword match {
case None =>
continueDsl(Return(None), identity)
case Some(a) =>
handler(a)
}
}
extension [FA, A](inline fa: FA)(using
inline notKeyword: util.NotGiven[
FA <:< Dsl.Keyword
],
inline asFA: FA <:< Option[A]
)
transparent inline def unary_! : A =
Dsl.shift(NoneSafe(asFA(fa))): A
}