return new Iterable<A>() {public Iterator<A> iterator() {
			final List<Iterator<A>> iterators = Cols.yield(iterables, Cols.<A>iteratorF());
			final HashMap<Integer, A> valMap = valMap(iterators);
			return new Iterator<A>() {

				@Override
				public boolean hasNext() {
					for (Entry<Integer, A> entry : valMap.entrySet()) {
						if (entry.getValue() != null) {
							return true;
						}
					}
					return false;
				}

				@Override
				public A next() {
					Entry<Integer, A> top = getTop(valMap);
					A ret = top.getValue();
					
					Iterator<A> iterator = iterators.get(top.getKey());
					A newValue = !iterator.hasNext() ? null : iterator.next();
					valMap.put(top.getKey(), newValue);
					return ret;
				}

				@Override
				public void remove() {
				}
			};
		}};
	}
	
//	public static void main(String[] args) {
//		LinkedList<Iterable<Range>> l2 = new LinkedList<Iterable<Range>>();
//		l2.add(new LinkedList<Range>());
//		l2.add(Arrays.asList(new Range(2,4), new Range(12,14)));
//		for (Range r : sequenceSorted(l2)) {
//			System.out.println(r);
//		}