static InternalSelector of()

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);
        }
    }