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