don't evaluate middle.iterator() until necessary