An 'extractor' can be a case class or an unapply or unapplySeq method.
Decoding what it is that they extract takes place before we arrive here,
so that this class can concentrate only on the relationship between
patterns and types.
In a case class, the class is the unextracted type and the fixed and
repeated types are derived from its constructor parameters.
In an unapply, this is reversed: the parameter to the unapply is the
unextracted type, and the other types are derived based on the return
type of the unapply method.
In other words, this case class and unapply are encoded the same:
case class Foo(x: Int, y: Int, zs: Char*)
def unapplySeq(x: Foo): Option[(Int, Int, Seq[Char])]
Both are Extractor(Foo, Int :: Int :: Nil, Repeated(Seq[Char], Char, Char*))
The type in its unextracted form
The non-sequence types which are extracted
The sequence type which is extracted