/
OptionMapper.scala
71 lines (60 loc) · 4.26 KB
/
OptionMapper.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package scala.slick.lifted
import annotation.implicitNotFound
import scala.slick.ast.{FunctionSymbol, BaseTypedType, Node, TypedType}
trait OptionMapper[BR, R] extends (Column[BR] => Column[R]) {
def lift: Boolean
def column(fs: FunctionSymbol, ch: Node*)(implicit bt: TypedType[BR]): Column[R] = {
implicit val tt = liftedType
Column.forNode[R](fs.typed(tt, ch: _*))
}
def liftedType(implicit bt: TypedType[BR]): TypedType[R] =
(if(lift) bt.optionType else bt).asInstanceOf[TypedType[R]]
}
@implicitNotFound("Cannot perform option-mapped operation\n with type: (${P1}, ${P2}) => ${R}\n for base type: (${B1}, ${B2}) => ${BR}")
sealed trait OptionMapper2[B1, B2, BR, P1, P2, R] extends OptionMapper[BR, R]
object OptionMapper2 {
val plain = new OptionMapper2[Any,Any,Any,Any,Any,Any] {
def apply(n: Column[Any]): Column[Any] = n
def lift = false
}
val option = new OptionMapper2[Any,Any,Any,Any,Any,Option[Any]] {
def apply(n: Column[Any]): Column[Option[Any]] = new PlainColumnExtensionMethods[Any](n).?
def lift = true
}
@inline implicit def getOptionMapper2TT[B1, B2 : BaseTypedType, BR] = OptionMapper2.plain .asInstanceOf[OptionMapper2[B1, B2, BR, B1, B2, BR]]
@inline implicit def getOptionMapper2TO[B1, B2 : BaseTypedType, BR] = OptionMapper2.option.asInstanceOf[OptionMapper2[B1, B2, BR, B1, Option[B2], Option[BR]]]
@inline implicit def getOptionMapper2OT[B1, B2 : BaseTypedType, BR] = OptionMapper2.option.asInstanceOf[OptionMapper2[B1, B2, BR, Option[B1], B2, Option[BR]]]
@inline implicit def getOptionMapper2OO[B1, B2 : BaseTypedType, BR] = OptionMapper2.option.asInstanceOf[OptionMapper2[B1, B2, BR, Option[B1], Option[B2], Option[BR]]]
}
@implicitNotFound("Cannot perform option-mapped operation\n with type: (${P1}, ${P2}, ${P3}) => ${R}\n for base type: (${B1}, ${B2}, ${B3}) => ${BR}")
sealed trait OptionMapper3[B1, B2, B3, BR, P1, P2, P3, R] extends OptionMapper[BR, R]
object OptionMapper3 {
val plain = new OptionMapper3[Any,Any,Any,Any,Any,Any,Any,Any] {
def apply(n: Column[Any]): Column[Any] = n
def lift = false
}
val option = new OptionMapper3[Any,Any,Any,Any,Any,Any,Any,Option[Any]] {
def apply(n: Column[Any]): Column[Option[Any]] = new PlainColumnExtensionMethods[Any](n).?
def lift = true
}
@inline implicit def getOptionMapper3TTT[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.plain .asInstanceOf[OptionMapper3[B1, B2, B3, BR, B1, B2, B3, BR]]
@inline implicit def getOptionMapper3TTO[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, B1, B2, Option[B3], Option[BR]]]
@inline implicit def getOptionMapper3TOT[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, B1, Option[B2], B3, Option[BR]]]
@inline implicit def getOptionMapper3TOO[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, B1, Option[B2], Option[B3], Option[BR]]]
@inline implicit def getOptionMapper3OTT[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, Option[B1], B2, B3, Option[BR]]]
@inline implicit def getOptionMapper3OTO[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, Option[B1], B2, Option[B3], Option[BR]]]
@inline implicit def getOptionMapper3OOT[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, Option[B1], Option[B2], B3, Option[BR]]]
@inline implicit def getOptionMapper3OOO[B1, B2 : BaseTypedType, B3 : BaseTypedType, BR] = OptionMapper3.option.asInstanceOf[OptionMapper3[B1, B2, B3, BR, Option[B1], Option[B2], Option[B3], Option[BR]]]
}
object OptionMapperDSL {
type arg[B1, P1] = {
type to[BR, PR] = OptionMapper2[B1, B1, BR, P1, P1, PR]
type toSame = OptionMapper2[B1, B1, B1, P1, P1, P1]
type arg[B2, P2] = {
type to[BR, PR] = OptionMapper2[B1, B2, BR, P1, P2, PR]
type arg[B3, P3] = {
type to[BR, PR] = OptionMapper3[B1, B2, B3, BR, P1, P2, P3, PR]
}
}
}
}