from typing import Callable


# def calculate(x:float, y:float, operation:str='a') -> None:
# 	def add():
# 		print(x + y)
# 	def sub():
# 		print(x - y)
# 	def div():
# 		if y == 0:
# 			print("На ноль делить нельзя!")
# 		else:
# 			print(x/y)
# 	def mul():
# 		print(x*y)

# 	match operation:
# 		case "a":
# 			add()
# 		case "s":
# 			sub()
# 		case "d":
# 			div()
# 		case "m":
# 			mul()
# 		case _:
# 			print("Ошибка. Данной операции не существует")



def get_math_func(operation: str) -> Callable[[int, int], int]:
    def add(a: int, b: int) -> int:
        return a + b

    def subtract(a: int, b: int) -> int:
        return a - b

    if operation == "+":
        return add
    elif operation == "-":
        return subtract
	
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# def create_accumulator():
# 	counter = 0
# 	def inner(x):
# 		nonlocal counter
# 		counter += x
# 		return counter
# 	return inner

# summator_1 = create_accumulator()

# print(summator_1(1)) # печатает 1
# print(summator_1(5)) # печатает 6
# print(summator_1(2)) # печатает 8

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def create_accumulator(st=0):
	counter = st
	def inner(x):
		nonlocal counter
		counter += x
		return counter
	return inner


# summator_1 = create_accumulator(100)
# print(summator_1(1)) # печатает 101
# print(summator_1(5)) # печатает 106
# print(summator_1(2)) # печатает 108

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def multiply(st):
	def inner(x):
		nonlocal st
		return x*st
	return inner

# f_2 = multiply(2)
# print("Умножение 2 на 5 =", f_2(5)) #10
# print("Умножение 2 на 15 =", f_2(15)) #30

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

from datetime import datetime
from time import perf_counter

def timer():
	start = perf_counter()
     
	def inner():
		return perf_counter() - start
      
	return inner

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def add(a, b):
	return a + b

def counter(func):
	count = 0
	def inner(*args, **kwargs):
		nonlocal count
		count += 1
		print(f"Функция {func.__name__} вызывалась {count} раз")
		return func(*args, **kwargs)
	return inner

# q = counter(add)
# q(10, 20)
# q(10, 20)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def create_dict():
	count = 0
	my_dict = {}
	def inner(foo):
		nonlocal count
		count += 1
		my_dict.update({count: foo})
		return my_dict
	return inner
	
f_1 = create_dict()
print(f_1('hello'))
print(f_1(100))
print(f_1([1, 2, 3]))