private void findNext() {
		DataIterator it = null;
		while ((it = currentIt()) != null) {
			Data data = it.next();
			DataType dt = data.getBaseDataType();
			if (matchesDataTypePredicate(dt) && matchesDataInstancePredicate(data)) {
				currentDataResult = data;
				return;
			}
			if (dataTypePredicate != null && isContainerDT(dt) &&
				recursiveMatchesDataTypePredicate(dt)) {
				itStack.addLast(new DataComponentIterator(data));
			}
		}
	}
LIFO stack of iterators.  Newly found iterators of sub-components are
pushed onto the end and become the current iterator.  When an iterator is exhausted, 
it is popped of the end and the uncovered iterator is now the current.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefinedDataIterator.java