Utility methods for macros.
The separate hierarchy from Applicative/Monad is for two reasons.
The separate hierarchy from Applicative/Monad is for two reasons.
1. The type constructor is represented as an abstract type because a TypeTag cannot represent a type constructor directly. 2. The applicative interface is uncurried.
A TupleBuilder
abstracts the work of constructing a tuple data structure such as a TupleN
or KList
and extracting values from it.
A TupleBuilder
abstracts the work of constructing a tuple data structure such as a TupleN
or KList
and extracting values from it. The Instance
macro implementation will (roughly) traverse the tree of its argument
and ultimately obtain a list of expressions with type M[T]
for different types T
.
The macro constructs an Input
value for each of these expressions that contains the Type
for T
,
the Tree
for the expression, and a ValDef
that will hold the value for the input.
TupleBuilder.apply
is provided with the list of Input
s and is expected to provide three values in the returned BuilderResult.
First, it returns the constructed tuple data structure Tree in input
.
Next, it provides the type constructor representationC
that, when applied to M, gives the type of tuple data structure.
For example, a builder that constructs a Tuple3
for inputs M[Int]
, M[Boolean]
, and M[String]
would provide a Type representing [L[x]] (L[Int], L[Boolean], L[String])
. The input
method
would return a value whose type is that type constructor applied to M, or (M[Int], M[Boolean], M[String])
.
Finally, the extract
method provides a list of vals that extract information from the applied input.
The type of the applied input is the type constructor applied to Id
([X] X
).
The returned list of ValDefs should be the ValDefs from inputs
, but with non-empty right-hand sides.
A TupleBuilder
that uses a KList as the tuple representation.
A builder that uses TupleN
as the representation for small numbers of inputs (up to TupleNBuilder.MaxInputs
)
and KList
for larger numbers of inputs.
A builder that uses TupleN
as the representation for small numbers of inputs (up to TupleNBuilder.MaxInputs
)
and KList
for larger numbers of inputs. This builder cannot handle fewer than 2 inputs.
A builder that uses a TupleN as the tuple representation.
A builder that uses a TupleN as the tuple representation.
It is limited to tuples of size 2 to MaxInputs
.
Utility methods for macros. Several methods assume that the context's universe is a full compiler (
scala.tools.nsc.Global
). This is not thread safe due to the underlying Context and related data structures not being thread safe. UseContextUtil[c.type](c)
to construct.