function intersection( iterators ) {
	var hash;
	var it;
	var v;
	var n;
	var j;

	// Create a new linked list for storing the intersection:
	hash = new LinkedList();

	// Find the intersection by first finding the unique values in the first iterator...
	it = iterators[ 0 ];
	while ( true ) {
		v = it.next();
		if ( v.done ) {
			break;
		}
		// Determine if we have seen this value before...
		n = getNode( hash, v.value );
		if ( n === null ) {
			// First time we have seen this value, so add to our unique value hash:
			hash.push( [ v.value, 1 ] );
		}
	}
	// Check whether we found any unique values:
	if ( hash.length === 0 ) {
		return hash;
	}
	// Now that we have found an initial set of unique values, we need to consume each subsequent iterator, updating the count indicating how many iterators have contained an iterated value and removing any values from our initial set which were not present in *all* iterators...
	for ( j = 1; j < iterators.length; j++ ) {
		it = iterators[ j ];
		while ( true ) {
			v = it.next();
			if ( v.done ) {
				break;
			}
			n = getNode( hash, v.value );
			if ( n && n.value[ 1 ] === j ) {
				// Only increment a value's counter the first time we see the value per iterator...
				n.value[ 1 ] += 1;
			}
		}
		// Upon consuming an iterator, we need to remove any hash values whose count is less than the number of iterators seen thus far:
		clean( hash, j+1 );

		// Check whether we still have any unique values:
		if ( hash.length === 0 ) {
			return hash;
		}
		// Move on to the next iterator...
	}
	return hash;
}
Finds the intersection of two or more iterators.

@private
@param {Array<Iterator>} iterators - list of iterators
@returns {LinkedList} a linked list containing the intersection