disambiguateName function
Returns a name that is not contained in usedNames by suffixing it with
the first possible suffix from suffixes.
The chosen name is added to usedNames.
If generateVariants is given, all the variants of a name must be available
before that name is chosen, and all the chosen variants will be added to
usedNames.
The returned name is that, which will generate the accepted variants.
Implementation
String disambiguateName(
String name,
Set<String> usedNames,
Iterable<String> suffixes, {
List<String> Function(String candidate)? generateVariants,
}) {
generateVariants ??= (String name) => <String>[name];
bool allVariantsAvailable(List<String> variants) {
return variants.every((String variant) => !usedNames.contains(variant));
}
var usedSuffix = '';
var candidateVariants = generateVariants(name);
if (!allVariantsAvailable(candidateVariants)) {
for (final suffix in suffixes) {
candidateVariants = generateVariants('$name$suffix');
if (allVariantsAvailable(candidateVariants)) {
usedSuffix = suffix;
break;
}
}
}
usedNames.addAll(candidateVariants);
return '$name$usedSuffix';
}