class RoutingRuleSelector {

    Optional<Cell> select(String routeKey, Predicate<Cell> filter) {
        Map<Cell, Pattern> cellRoutingPatterns = compileRoutingPatterns.apply(routingRulesSupplier.get());

        return cellRoutingPatterns.entrySet().stream()
                .filter(entry -> filter.test(entry.getKey()))
                .filter(entry -> entry.getValue().matcher(routeKey).matches())
                .findFirst()
                .map(Map.Entry::getKey);
    }

      RoutingRuleSelector(CellInfoResolver cellInfoResolver, Supplier<String> routingRulesSupplier);

}