def apply(op, x, y):
    return op(x, y)


from operator import mul

print(apply(mul, 3, 7))


print((lambda x, y: x ^ y)(7, 10))

from operator import xor

print(xor(7, 10))


from operator import length_hint

iterator = iter([2, 4, 12, 5, 18, 7])
print(length_hint(iterator))

print(iterator.__length_hint__())


from operator import countOf

print(countOf([1, 4, 7, 15, 7, 5, 4, 7], 7))


from operator import indexOf

print(indexOf([1, 4, 7, 15, 7, 5, 4, 7], 7))


rows = [
    {"name": "John", "surname": "Doe", "id": 2},
    {"name": "Andy", "surname": "Smith", "id": 1},
    {"name": "Joseph", "surname": "Jones", "id": 3},
    {"name": "Oliver", "surname": "Smith", "id": 4},
]
from operator import itemgetter

sorted_by_name = sorted(rows, key=itemgetter("surname", "name"))
print(sorted_by_name)

print(min(rows, key=itemgetter("id")))


class Order:
    def __init__(self, order_id):
        self.order_id = order_id

    def __repr__(self):
        return f"Order({self.order_id})"


orders = [Order(23), Order(6), Order(15), Order(11)]
from operator import attrgetter

print(sorted(orders, key=attrgetter("order_id")))


orders = [
    {"date": "07/10/2021", "id": 10001},
    {"date": "07/10/2021", "id": 10002},
    {"date": "07/12/2021", "id": 10003},
    {"date": "07/15/2021", "id": 10004},
    {"date": "07/15/2021", "id": 10005},
]

from operator import itemgetter
from itertools import groupby

orders.sort(key=itemgetter("date"))
for date, rows in groupby(orders, key=itemgetter("date")):
    print(f"On {date}:")
    for order in rows:
        print(order)
    print()


# Sort dict by value
from operator import itemgetter

products = {
    "Headphones": 55.90,
    "USB drive": 12.20,
    "Ethernet Cable": 8.12,
    "Smartwatch": 125.80,
}

sort_by_price = sorted(products.items(), key=itemgetter(1))
print(sort_by_price)

# Find index of maximum value in array
prices = [55.90, 12.20, 8.12, 99.80, 18.30]
index, price = max(enumerate(prices), key=itemgetter(1))
print(index, price)

# Sort list of tuples based on their indices
names = [
    ("John", "Doe"),
    ("Andy", "Jones"),
    ("Joseph", "Smith"),
    ("Oliver", "Smith"),
]

print(sorted(names, key=itemgetter(1, 0)))
