static KeyPath searchForInAggregate(TraceObjectSchema seed,
				Predicate<SearchEntry> predicate) {
			InAggregateSearch inAgg = new InAggregateSearch(seed);
			while (!inAgg.allOnLevel.isEmpty()) {
				Set<SearchEntry> found = inAgg.allOnLevel.stream()
						.filter(predicate)
						.collect(Collectors.toSet());
				if (!found.isEmpty()) {
					if (found.size() == 1) {
						return found.iterator().next().path;
					}
					return null;
				}
				inAgg.nextLevel();
			}
			return null;
		}
Find (sub) path patterns that match objects implementing a given interface

<p>
Each returned path pattern accepts relative paths from an object having this schema to a
successor implementing the interface.

@param type the sub-type of {@link TraceObjectInterface} to search for
@param prefix the prefix for each relative path pattern
@param requireCanonical only return patterns matching a canonical location for the type
@return a set of patterns where such objects could be found
Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/target/schema/TraceObjectSchema.java