from typing import List, Set, Dict, Tuple

# a: int = 2
# b: float = 2.3
# c: str = "lkasldkjaslkjdasd"
# cc: bytes = b"AAA"
# d: None = None
# e: bool = True
# f: bool = False
# k: Tuple[int, str, str] = (1, "hello", "world")

# g: List[int] = [7]
# j: Set[str] = {"friend a", "friend b"}
# i: Dict[str, int] = {"4": 6, "6": 8}

# import collections

# print(dir(collections))

# i["5"] = 7
# print(dict[str])

#

from dataclasses import dataclass


@dataclass
class Card:
    suit: str
    rank: int  # 1 -> ace, 10+ -> jack, queen, king

    def __str__(self) -> str:
        if self.rank == 1:
            rank_str = "ace"
        elif self.rank == 10:
            rank_str = "jack"
        elif self.rank == 11:
            rank_str = "queen"
        elif self.rank == 12:
            rank_str = "king"
        else:
            rank_str = str(self.rank)
        return f"{rank_str} of {self.suit}"

    # def __lt__(self, other) -> bool:
    #     if self.suit != other.suit:
    #         return self.suit < other.suit
    #     else:
    #         return self.rank < other.rank


hand: List[Card] = [
    Card(suit="clubs", rank=6),
    Card(suit="clubs", rank=5),
    Card(suit="spades", rank=1),
    Card(suit="hearts", rank=10),
]

print(hand[0].__str__())


def suit_first(card: Card) -> Tuple:
    return (card.suit, card.rank)


def rank_first(card: Card) -> Tuple:
    return (card.rank, card.suit)


# hand.sort(key=suit_first)
# hand.sort(key=rank_first)
# print(hand)

# print((1, "clubs", "cinnamon") < (1, "clubs", "vanilla"))

# O(N ^ 2)


# for i in range(10):
#     print(i)

# iterable = range(4)
# iterator = iter(iterable)
# # print(dir(iterator))
# # print(iterator.__str__()[0])
# # print(iterator)

# # print(dir(iterator.__next__))
# print(next.__doc__)

# try:
#     while True:
#         print(iterator.__next__())

# except StopIteration:
#     print("handled!")

[
    "__class__",
    "__delattr__",
    "__dir__",
    "__doc__",
    "__eq__",
    "__format__",
    "__ge__",
    "__getattribute__",
    "__gt__",
    "__hash__",
    "__init__",
    "__init_subclass__",
    "__iter__",
    "__le__",
    "__length_hint__",
    "__lt__",
    "__ne__",
    "__new__",
    "__next__",
    "__reduce__",
    "__reduce_ex__",
    "__repr__",
    "__setattr__",
    "__setstate__",
    "__sizeof__",
    "__str__",
    "__subclasshook__",
]

# print(next(iterator))
# print(next(iterator))
# print(next(iterator))
# print(next(iterator))
# print(next(iterator))


# def sum_until(x: int) -> int:
#     """computes the sum of number from 0 to x (inclusive)"""

#     to_sum = list(range(x + 1))
#     print(to_sum)
#     s = 0
#     for num in to_sum:
#         s += num
#     return s


# print(sum_until(3))

# from abc import ABC
# from dataclasses import dataclass
# from typing import List


# class Animal(ABC):
#     def make_noise(self):
#         pass


# @dataclass
# class Cat(Animal):
#     name: str

#     def make_noise(self):
#         print("meow")


# class Lion(Cat):
#     def hunt(self):
#         print("nom")


# class Kitty(Cat):
#     def make_noise(self):
#         print("purr")


# animals: List[Animal] = [
#     Kitty(name="Star Child"),
#     Lion(name="Simba"),
# ]
# for animal in animals:
#     animal.make_noise()
