# SPDX-License-Identifier: MIT
def add(value, amount=3):
    return value+amount
def negate(value):
    return -value
def apply(function, value):
    return function(value)
def identity(function):
    return function
selected=add
print(selected(4),selected(4,amount=9),apply(add,5),apply(negate,5))
print(identity(add)(7),[add,add][1](8),(add,negate)[1](9))
print(selected is add,selected is negate,selected==add,selected!=negate)
print(bool(selected),int(bool(selected)),callable(selected),callable(None),callable([1]))
print(callable(int),callable(object),isinstance(selected,object),isinstance(selected,int))
print(selected.__name__,selected.__module__,type(selected).__name__)
absolute=abs
length=len
print(apply(absolute,-5),apply(length,'é🙂'),absolute.__name__,type(absolute).__name__)
len=42
print(length('abc'),len)
class Holder:
    def __init__(self, callback):
        self.callback=callback
holder=Holder(add)
saved=holder.callback
print(saved(2),saved is add,holder.callback(3))
def receiver():
    print('receiver')
    return holder
print(receiver().callback(4))
def supplier():
    print('callable')
    return add
def argument():
    print('argument')
    return 4
print(supplier()(argument()))
def fail(value):
    raise ValueError(value)
try:
    apply(fail,7)
except ValueError as error:
    print(repr(error))
