Often we have some types in an intersection that could be simplified, but core.typed does not know how without manually adding all the rules.

(I (Vec Any) (Seqable Number))
could be simplified to (Vec Number)

Perhaps we need some sort of virtual type that only exists at compile time that acts as a supertype to related types.

For collections, perhaps something like Seqable. We probably don't want to use Seqable because in CLJS there is no inheritance of protocols: we don't want to simulate inheritance of protocols at compile time.

This seems like an extra "layer" of types on top of protocols.

Say we have a (VirtualSeqable t) type at this upper layer of types, that talks about things that can be converted to a sequence of t.

The user would then extend the appropriate protocols:

 (extend-virtual [[t :variance :covariant]] VirtualSeqable
   (Vec t))  
 (extend-virtual [[t :variance :covariant]] VirtualSeqable
   (Seqable t))  

TODO: Flesh out this idea Smile