I wonder if we should build on the any
and some
prefix syntax and use a prefix like meta
(as a strawman):
any T
is the associated existentialmeta T
is the metatype of Tany meta T
is the metatype of the associated existentialany P
is the existential for the protocolmeta P
is the protocol metatypeany meta P
is the metatype of the protocol existential
I realized after posting it that my approach to solving the nesting issue depended on the fact that the name of the existential type matches the name of the protocol (or the unbound name of a generic type for concrete type existentials). This is what made the P.NestedType
or Array.NestedType
syntax work.
With this prefix approach to existentials that would become (any P).NestedType
or (any Array).NestedType
which is not what we want when it comes to using types and protocols as namespaces. Maybe one option would be to use some
on concrete types:
// We don't know what the type of `Element` is so any static members put in this
// extension are available using `Array.NestedType`, `Array.constant`, etc syntax.
// (as well as being available as `Array<Int>.NestedType`, etc
extension some Array {}