HandRange.fromCardPairs constructor

HandRange.fromCardPairs(
  1. Iterable<CardPair> cardPairs
)

Creates a HandRange from an iterable of CardPair.

Implementation

factory HandRange.fromCardPairs(Iterable<CardPair> cardPairs) {
  final cardPairSet = cardPairs.toSet();
  final pocketRankPairs = <RankPair>{};
  final suitedRankPairs = <RankPair>{};
  final ofsuitRankPairs = <RankPair>{};
  final individualCardPairs = <CardPair>{};

  for (final rank in _ranks) {
    final pocketCardPairs = RankPair.pocket(rank).toSet();

    if (pocketCardPairs.every((cp) => cardPairSet.contains(cp))) {
      cardPairSet.removeAll(pocketCardPairs);

      pocketRankPairs.add(RankPair.pocket(rank));
    }
  }

  for (int i = 0; i < _ranks.length; ++i) {
    final hr = _ranks[i];

    for (final kr in _ranks.sublist(i + 1)) {
      final suitedCardPairs = RankPair.suited(hr, kr).toSet();
      final ofsuitCardPairs = RankPair.ofsuit(hr, kr).toSet();

      if (suitedCardPairs.every((cp) => cardPairSet.contains(cp))) {
        cardPairSet.removeAll(suitedCardPairs);

        suitedRankPairs.add(RankPair.suited(hr, kr));
      }

      if (ofsuitCardPairs.every((cp) => cardPairSet.contains(cp))) {
        cardPairSet.removeAll(ofsuitCardPairs);

        ofsuitRankPairs.add(RankPair.ofsuit(hr, kr));
      }

      for (final hs in _suits) {
        for (final ks in _suits) {
          final cardPair = CardPair(Card(hr, hs), Card(kr, ks));

          if (cardPairSet.contains(cardPair)) {
            individualCardPairs.add(cardPair);
          }
        }
      }
    }
  }

  return HandRange._(
    pocketRankPairs: pocketRankPairs,
    suitedRankPairs: suitedRankPairs,
    ofsuitRankPairs: ofsuitRankPairs,
    individualCardPairs: individualCardPairs,
  );
}