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 Inputs 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.