# SPDX-License-Identifier: MIT
def score(value):
    print('key',value)
    return abs(value)
print(min(-3,3,-4,key=score))
print(max([-3,3,-4],key=score))
print(min(['bbb','aa','zz'],key=len),max('abracadabra',key=len))
print(min(range(-4,5),key=abs),max(range(-4,5),key=abs))
class Task:
    def __init__(self,name,priority):
        self.name=name
        self.priority=priority
def priority(task):
    print('task',task.name)
    return task.priority
first=Task('first',3)
second=Task('second',3)
third=Task('third',1)
print(max([first,second,third],key=priority) is first)
print(min(first,second,third,key=priority) is third)
def forbidden(value):
    print('unexpected key call')
    return value
print(min([],default='empty',key=forbidden))
empty=[0]
empty.clear()
print(min(empty,default=99,key=forbidden))
def get_key():
    print('key expression')
    return score
def get_default():
    print('default expression')
    return 99
print(min([-4,2],default=get_default(),key=get_key()))
print(max([-4,2],key=get_key(),default=get_default()))
growing=[3,1]
def grow(value):
    print('grow',value)
    if value==3:
        growing.append(0)
    return value
print(min(growing,key=grow),growing)
mapping={'a':3,'b':1}
def remove(value):
    mapping.clear()
    return value
try:
    min(mapping,key=remove)
except RuntimeError as error:
    print(repr(error))
def fail(value):
    if value==2:
        raise ValueError('key failed')
    return value
try:
    max([1,2,3],key=fail)
except ValueError as error:
    print(repr(error))
chooser=min
print(chooser([4,-2,3],key=abs),max((),default='empty',key=42))
