public Stream<? extends TraceObjectValPath> walkValue(Visitor visitor,
			TraceObjectValue value, Lifespan span, TraceObjectValPath path) {
		Objects.requireNonNull(value);
		Lifespan compSpan = visitor.composeSpan(span, value);
		if (compSpan == null) {
			return Stream.empty();
		}
		TraceObjectValPath compPath = visitor.composePath(path, value);
		if (compPath == null) {
			return Stream.empty();
		}

		switch (visitor.visitValue(value, compPath)) {
			case INCLUDE_PRUNE:
				return Stream.of(compPath);
			case EXCLUDE_PRUNE:
				return Stream.empty();
			case INCLUDE_DESCEND: {
				TraceObject object = visitor.continueObject(value);
				return Stream.concat(Stream.of(compPath),
					walkObject(visitor, object, compSpan, compPath));
			}
			case EXCLUDE_DESCEND: {
				TraceObject object = visitor.continueObject(value);
				return walkObject(visitor, object, compSpan, compPath);
			}
		}
		throw new AssertionError();
	}
Walk a value and possibly its subtree

@param visitor the visitor
@param value the current value
@param span the composed span from seed to but excluding the current value
@param path the path from seed to but excluding the current value
@return the result stream of the value and subtree walked
Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/visitors/TreeTraversal.java