static Set applyWordTokRules_es(L rules, ES s) { ret concatListsToCISet(map(rules, rule -> rule.matches(s!) ? map ext(getStringEmits(rule)) : null ); } static Set applyWordTokRules_es(L rules, Collection inputs) { Set out = cloneLinkedCISet_es(inputs); for unnull (ES input : inputs) functionReturningList_transitiveHull_ciSet(func(ES s) -> Collection { applyWordTokRules_es(rules, s) }, input, seen := out); ret out; }