public bool TopPair(PokerHand hand, int rIdx, int aIdx)
        {
            if(Hand.EvaluateType(hand.HeroHoleCards() | hand.BoardMask((Rounds)rIdx)) != Hand.HandTypes.Pair)
                return false;

            var board = hand.Board((Rounds)rIdx);
            var top = board.Max(c => c.Rank);
            return top == hand.HoleCards[0].Rank || top == hand.HoleCards[1].Rank;
        }
        public bool StraightDrawHit(PokerHand hand, int rIdx, int aIdx)
        {
            var prev = hand.Board((Rounds)(rIdx - 1)).ToMask();
            var prevCount = Hand.CountContiguous(prev);
            if (prevCount != 2)
                return false;

            var board = hand.BoardMask((Rounds)rIdx);
            var hole = hand.HeroHoleCards();

            foreach(var opp in Hand.Hands(0UL, hole | board, 2))
                if (Hand.EvaluateType(board | opp) == Hand.HandTypes.Straight
                    && Hand.EvaluateType(prev | opp) != Hand.HandTypes.Straight
                    && Hand.IsOpenEndedStraightDraw(prev | opp, hole))
                    return true;
            return false;
        }
        public int SecondaryBoardSuit(PokerHand hand, int rIdx, int aIdx)
        {
            var board = hand.Board((Rounds)rIdx);
            var suits = board.GroupBy(c => c.Suit).OrderByDescending(g => g.Count());

            var secondary = suits.Skip(1).FirstOrDefault();
            if (secondary == null)
                return 0;
            return secondary.Count();
        }
 public bool FourCardStraightHit(PokerHand hand, int rIdx, int aIdx)
 {
     var prev = hand.Board((Rounds)(rIdx - 1)).ToMask();
     int prevCount = Hand.CountContiguous(prev);
     if (prevCount != 3)
         return false;
     return Hand.CountContiguous(hand.BoardMask((Rounds)rIdx)) == 4;
 }
        public bool FlushDrawHit(PokerHand hand, int rIdx, int aIdx)
        {
            var prev = hand.Board((Rounds)(rIdx-1));
            var prevSuits = prev.GroupBy(c => c.Suit).OrderByDescending(g => g.Count());

            if (prevSuits.First().Count() != 2)
                return false;

            var board = hand.Board((Rounds)rIdx);
            var suits = board.GroupBy(c => c.Suit).OrderByDescending(g => g.Count());

            return suits.First().Count() == 3;
        }
        public int DominantBoardSuit(PokerHand hand, int rIdx, int aIdx)
        {
            var board = hand.Board((Rounds)rIdx);
            var suits = board.GroupBy(c => c.Suit).OrderByDescending(g => g.Count());

            return suits.First().Count();
        }