private <T> BeansXml merge(Iterable<? extends T> items, Function<T, BeansXml> function, boolean removeDuplicates) {
List<Metadata<String>> alternatives = new ArrayList<Metadata<String>>();
List<Metadata<String>> alternativeStereotypes = new ArrayList<Metadata<String>>();
List<Metadata<String>> decorators = new ArrayList<Metadata<String>>();
List<Metadata<String>> interceptors = new ArrayList<Metadata<String>>();
List<Metadata<Filter>> includes = new ArrayList<Metadata<Filter>>();
List<Metadata<Filter>> excludes = new ArrayList<Metadata<Filter>>();
boolean isTrimmed = false;
URL beansXmlUrl = null;
for (T item : items) {
BeansXml beansXml = function.apply(item);
addTo(alternatives, beansXml.getEnabledAlternativeClasses(), removeDuplicates);
addTo(alternativeStereotypes, beansXml.getEnabledAlternativeStereotypes(), removeDuplicates);
addTo(decorators, beansXml.getEnabledDecorators(), removeDuplicates);
addTo(interceptors, beansXml.getEnabledInterceptors(), removeDuplicates);
includes.addAll(beansXml.getScanning().getIncludes());
excludes.addAll(beansXml.getScanning().getExcludes());
if (beansXml instanceof TrimmableBeansXml) {
isTrimmed = ((TrimmableBeansXml) beansXml).isTrimmed();
}
beansXmlUrl = beansXml.getUrl();
}
return new BeansXmlImpl(alternatives, alternativeStereotypes, decorators, interceptors, new ScanningImpl(includes, excludes), beansXmlUrl,
BeanDiscoveryMode.ALL, null, isTrimmed);
}