sS replaceDollarVars_withCustomToString(IF1 stringifier, S s, O... params) { if (empty(params)) ret s; MapSO vars = mapKeys dropDollarPrefix((MapSO) litcimap(params)); ret replaceDollarVars_dyn(s, var -> { O value = vars.get(var); ret value == null ?: stringifier.get(value); }); } sS replaceDollarVars_withCustomToString(S s, IF1 stringifier, O... params) { ret replaceDollarVars_withCustomToString(stringifier, s, params); }