CardSetInventory constructor

CardSetInventory(
  1. Set<Card> cards, {
  2. CardSet? belongsTo,
})

Creates a new CardSetInventory for the given cards in belongsTo.

If belongsTo is not specified, the first card's Card.cardSet is used.

While cards does not need to be all the cards in cardSet (i.e. due to partial releases), every card in cards must belong to cardSet or an error will be thrown.

Implementation

factory CardSetInventory(Set<Card> cards, {CardSet? belongsTo}) {
  if (belongsTo == null) {
    if (cards.isEmpty) {
      throw ArgumentError.value(
        '<empty set>',
        'cards',
        'Must specify belongsTo if cards is empty',
      );
    }
    belongsTo = cards.first.cardSet;
  }

  // Create an indexed lookup table for the cards in the set.
  final lookupCards = List<Card?>.filled(belongsTo.totalCards, null);
  final lookupTokens = List<TokenCard?>.filled(belongsTo.totalCards, null);
  for (final card in cards) {
    if (card.cardSet != belongsTo) {
      throw ArgumentError.value(
        card,
        'cards',
        'Card does not belong to $belongsTo',
      );
    }
    if (card is TokenCard) {
      lookupTokens[card.orderInSet - 1] = card;
    } else {
      lookupCards[card.orderInSet - 1] = card;
    }
  }

  return CardSetInventory._(
    cards,
    belongsTo,
    lookupCards,
    lookupTokens,
  );
}