TextChannel.of constructor
Implementation
factory TextChannel.of({
required List<String> base,
required List<String> head,
}) {
// Multiset, not set: a list gaining a second "Buy" is a change, and two
// sets would call it nothing.
var remaining = <String, int>{};
for (var text in base) {
remaining[text] = (remaining[text] ?? 0) + 1;
}
var added = <String>[];
for (var text in head) {
var left = remaining[text] ?? 0;
if (left > 0) {
remaining[text] = left - 1;
} else {
added.add(text);
}
}
var removed = [
for (var entry in remaining.entries)
for (var i = 0; i < entry.value; i++) entry.key,
];
return TextChannel(added: added, removed: removed);
}