in smithy-model/src/main/java/software/amazon/smithy/model/selector/AndSelector.java [33:116]
static InternalSelector of(List<InternalSelector> selectors) {
switch (selectors.size()) {
case 0:
// This happens when selectors are optimized (i.e., the first internal
// selector is a shape type and it gets applied in Model.shape() before
// pushing shapes through the selector.
return InternalSelector.IDENTITY;
case 1:
// If there's only a single selector, then no need to wrap.
return selectors.get(0);
case 2:
// Cases 2-7 are optimizations that make selectors about
// 40% faster based on JMH benchmarks (at least on my machine,
// JDK 11.0.5, Java HotSpot(TM) 64-Bit Server VM, 11.0.5+10-LTS).
// I stopped at 7 because, it needs to stop somewhere, and it's lucky.
return (c, s, n) -> {
return selectors.get(0).push(c, s, (c2, s2) -> {
return selectors.get(1).push(c2, s2, n);
});
};
case 3:
return (c, s, n) -> {
return selectors.get(0).push(c, s, (c2, s2) -> {
return selectors.get(1).push(c2, s2, (c3, s3) -> {
return selectors.get(2).push(c3, s3, n);
});
});
};
case 4:
return (c, s, n) -> {
return selectors.get(0).push(c, s, (c2, s2) -> {
return selectors.get(1).push(c2, s2, (c3, s3) -> {
return selectors.get(2).push(c3, s3, (c4, s4) -> {
return selectors.get(3).push(c4, s4, n);
});
});
});
};
case 5:
return (c, s, n) -> {
return selectors.get(0).push(c, s, (c2, s2) -> {
return selectors.get(1).push(c2, s2, (c3, s3) -> {
return selectors.get(2).push(c3, s3, (c4, s4) -> {
return selectors.get(3).push(c4, s4, (c5, s5) -> {
return selectors.get(4).push(c5, s5, n);
});
});
});
});
};
case 6:
return (c, s, n) -> {
return selectors.get(0).push(c, s, (c2, s2) -> {
return selectors.get(1).push(c2, s2, (c3, s3) -> {
return selectors.get(2).push(c3, s3, (c4, s4) -> {
return selectors.get(3).push(c4, s4, (c5, s5) -> {
return selectors.get(4).push(c5, s5, (c6, s6) -> {
return selectors.get(5).push(c6, s6, n);
});
});
});
});
});
};
case 7:
return (c, s, n) -> {
return selectors.get(0).push(c, s, (c2, s2) -> {
return selectors.get(1).push(c2, s2, (c3, s3) -> {
return selectors.get(2).push(c3, s3, (c4, s4) -> {
return selectors.get(3).push(c4, s4, (c5, s5) -> {
return selectors.get(4).push(c5, s5, (c6, s6) -> {
return selectors.get(5).push(c6, s6, (c7, s7) -> {
return selectors.get(6).push(c7, s7, n);
});
});
});
});
});
});
};
default:
return new RecursiveAndSelector(selectors);
}
}