template
<
typename D,
typename ... TValues
>
Events<D,std::tuple<TValues...>>
Join(const Events<D,TValues>& ... sources);
Emit a tuple (e1,…,eN) for each complete set of values for sources 1 … N.
Each source slot has its own unbounded buffer queue that persistently stores incoming events. For as long as all queues are not empty, one value is popped from each and emitted together as a tuple.