TextChannel.of constructor

TextChannel.of({
  1. required List<String> base,
  2. required List<String> head,
})

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