-
Notifications
You must be signed in to change notification settings - Fork 116
/
magnolia.scala
88 lines (71 loc) · 3.05 KB
/
magnolia.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package magnolia1
import scala.compiletime.*
import scala.deriving.Mirror
import scala.reflect.*
import Macro.*
trait CommonDerivation[TypeClass[_]]:
type Typeclass[T] = TypeClass[T]
def join[T](ctx: CaseClass[Typeclass, T]): Typeclass[T]
inline def derivedMirrorProduct[A](
product: Mirror.ProductOf[A]
): Typeclass[A] = join(CaseClassDerivation.fromMirror(product))
inline def getParams__[T, Labels <: Tuple, Params <: Tuple](
annotations: Map[String, List[Any]],
inheritedAnnotations: Map[String, List[Any]],
typeAnnotations: Map[String, List[Any]],
repeated: Map[String, Boolean],
defaults: Map[String, Option[() => Any]],
idx: Int = 0
): List[CaseClass.Param[Typeclass, T]] = CaseClassDerivation.paramsFromMaps(
annotations,
inheritedAnnotations,
typeAnnotations,
repeated,
defaults
)
// for backward compatibility with v1.1.1
inline def getParams_[T, Labels <: Tuple, Params <: Tuple](
annotations: Map[String, List[Any]],
inheritedAnnotations: Map[String, List[Any]],
typeAnnotations: Map[String, List[Any]],
repeated: Map[String, Boolean],
idx: Int = 0
): List[CaseClass.Param[Typeclass, T]] =
getParams__(annotations, Map.empty, typeAnnotations, repeated, Map(), idx)
// for backward compatibility with v1.0.0
inline def getParams[T, Labels <: Tuple, Params <: Tuple](
annotations: Map[String, List[Any]],
typeAnnotations: Map[String, List[Any]],
repeated: Map[String, Boolean],
idx: Int = 0
): List[CaseClass.Param[Typeclass, T]] =
getParams__(annotations, Map.empty, typeAnnotations, repeated, Map(), idx)
end CommonDerivation
trait ProductDerivation[TypeClass[_]] extends CommonDerivation[TypeClass]:
inline def derivedMirror[A](using mirror: Mirror.Of[A]): Typeclass[A] =
inline mirror match
case product: Mirror.ProductOf[A] => derivedMirrorProduct[A](product)
inline given derived[A](using Mirror.Of[A]): Typeclass[A] = derivedMirror[A]
end ProductDerivation
trait Derivation[TypeClass[_]]
extends CommonDerivation[TypeClass]
with SealedTraitDerivation:
def split[T](ctx: SealedTrait[Typeclass, T]): Typeclass[T]
transparent inline def subtypes[T, SubtypeTuple <: Tuple](
m: Mirror.SumOf[T],
idx: Int = 0
): List[SealedTrait.Subtype[Typeclass, T, _]] =
subtypesFromMirror[T, SubtypeTuple](m, idx)
inline def derivedMirrorSum[A](sum: Mirror.SumOf[A]): Typeclass[A] =
split(sealedTraitFromMirror(sum))
inline def derivedMirror[A](using mirror: Mirror.Of[A]): Typeclass[A] =
inline mirror match
case sum: Mirror.SumOf[A] => derivedMirrorSum[A](sum)
case product: Mirror.ProductOf[A] => derivedMirrorProduct[A](product)
inline def derived[A](using Mirror.Of[A]): Typeclass[A] = derivedMirror[A]
protected override inline def deriveSubtype[s](
m: Mirror.Of[s]
): Typeclass[s] = derivedMirror[s](using m)
end Derivation
trait AutoDerivation[TypeClass[_]] extends Derivation[TypeClass]:
inline given autoDerived[A](using Mirror.Of[A]): TypeClass[A] = derived