public SuitTieredGridStatus(GridCategoryEnum category)
 {
     Category      = category;
     SuitedStatus  = new SuitedStatus <T>();
     PairedStatus  = new PairedStatus <T>();
     OffsuitStatus = new OffsuitStatus <T>();
 }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append($"RankWiseStatus={RankWiseStatus},");
            switch (Category)
            {
            case GridCategoryEnum.Suited:
                sb.Append(
                    $"SuitedStatus={SuitedStatus.ToString()}");
                break;

            case GridCategoryEnum.Offsuit:
                sb.Append(
                    $"OffsuitStatus={OffsuitStatus.ToString()}");
                break;

            case GridCategoryEnum.Paired:
                sb.Append($"PairedStatus={PairedStatus.ToString()}");
                break;

            default:
                throw new InvalidOperationException();
            }

            return(sb.ToString());
        }
        public void SetSuitUnlessForSuitedGrid(SuitEnum suit, T set, Func <T, bool> unless)
        {
            if (Category != GridCategoryEnum.Suited)
            {
                throw new InvalidOperationException();
            }

            SuitedStatus.SetSuitUnless(suit, set, unless);
        }
        public SuitedStatus <T> Clone()
        {
            var cloned = new SuitedStatus <T>();

            cloned.HeartStatus   = HeartStatus;
            cloned.SpadeStatus   = SpadeStatus;
            cloned.DiamondStatus = DiamondStatus;
            cloned.ClubStatus    = ClubStatus;
            return(cloned);
        }
        public int GetCount(Func <T, bool> func)
        {
            switch (Category)
            {
            case GridCategoryEnum.Suited:
                return(SuitedStatus.Count(func));

            case GridCategoryEnum.Paired:
                return(PairedStatus.Count(func));

            case GridCategoryEnum.Offsuit:
                return(OffsuitStatus.Count(func));

            default:
                throw new InvalidOperationException();
            }
        }
        public void SetAllUnless(T set, Func <T, bool> unless)
        {
            switch (Category)
            {
            case GridCategoryEnum.Suited:
                SuitedStatus.SetAllUnless(set, unless);
                break;

            case GridCategoryEnum.Offsuit:
                OffsuitStatus.SetAllUnless(set, unless);
                break;

            case GridCategoryEnum.Paired:
                PairedStatus.SetAllUnless(set, unless);
                break;
            }
        }
        public GridStatusInPlayerRange Clone()
        {
            var cloned = new GridStatusInPlayerRange(Category);

            cloned.RankWiseStatus = this.RankWiseStatus;
            switch (Category)
            {
            case GridCategoryEnum.Suited:
                cloned.SuitedStatus = SuitedStatus.Clone();
                break;

            case GridCategoryEnum.Paired:
                cloned.PairedStatus = PairedStatus.Clone();
                break;

            case GridCategoryEnum.Offsuit:
                cloned.OffsuitStatus = OffsuitStatus.Clone();
                break;
            }

            return(cloned);
        }