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';
}