public <T> T getRule(Rule rule, Supplier<T> converter) {
        T match = (T) ruleConversionMap.get(rule);
        if (match != null) return match;

        T newMatch = converter.get();
        ruleConversionMap.put(rule, newMatch);
        return newMatch;
    }
public < T > T getRule ( Rule rule , Supplier < T > converter ) { T match = ( T ) ruleConversionMap . get ( rule ) ; if ( match != null ) return match ; T newMatch = converter . get ( ) ; ruleConversionMap . put ( rule , newMatch ) ; return newMatch ; }
@param rule      for which the parsed rule should be retrieved
@param converter rule converter
@param <T>       type of object converter converts to
@return parsed rule object