static CellExtractor from()

in src/main/java/org/apache/commons/collections4/bloomfilter/CellExtractor.java [85:139]


    static CellExtractor from(final IndexExtractor indexExtractor) {
        return new CellExtractor() {
            /**
             * Class to track cell values in the TreeMap.
             */
            final class CounterCell implements Comparable<CounterCell> {
                final int idx;
                int count;

                CounterCell(final int idx, final int count) {
                    this.idx = idx;
                    this.count = count;
                }

                @Override
                public int compareTo(final CounterCell other) {
                    return Integer.compare(idx, other.idx);
                }
            }

            TreeMap<CounterCell, CounterCell> counterCells = new TreeMap<>();

            @Override
            public int[] asIndexArray() {
                populate();
                return counterCells.keySet().stream().mapToInt(c -> c.idx).toArray();
            }

            private void populate() {
                if (counterCells.isEmpty()) {
                    indexExtractor.processIndices(idx -> {
                        final CounterCell cell = new CounterCell(idx, 1);
                        final CounterCell counter = counterCells.get(cell);
                        if (counter == null) {
                            counterCells.put(cell, cell);
                        } else {
                            counter.count++;
                        }
                        return true;
                    });
                }
            }

            @Override
            public boolean processCells(final CellPredicate consumer) {
                populate();
                for (final CounterCell cell : counterCells.values()) {
                    if (!consumer.test(cell.idx, cell.count)) {
                        return false;
                    }
                }
                return true;
            }
        };
    }