@Override
	public T next() {
		final var it = queue.peek();
		if (it == null) {
			throw new NoSuchElementException("No next element.");
		}

		final T node = it.next();
		if (!it.hasNext()) {
			queue.poll();
		}

		final S source = mapper.apply(node);
		final var exists = !visited.add(identity.apply(source));
		final Iterator<? extends T> children = exists
			? Collections.emptyIterator()
			: dtor.unapply(source).iterator();

		if (children.hasNext()) {
			queue.add(children);
		}

		return node;
	}
Create a new (<em>property</em>) breath-first iterator from the given
arguments.

@param object the root object of the model
@param dtor the extractor function which extracts the direct
       extractable properties
@param mapper mapper function for creating the source object for the
       next level from the extracted objects of type {@code T}
@param identity objects, returned by this function are used for identifying
       already visited source objects, for preventing infinite loops
jenetics.incubator/src/main/java/io/jenetics/incubator/beans/internal/BreathFirstIterator.java