# SPDX-License-Identifier: MIT
# https://docs.python.org/3.9/reference/datamodel.html#object.__index__
events = []
class Index:
    def __init__(self, value):
        self.value = value
    def __index__(self):
        events.append(self.value)
        return self.value
class Child(Index):
    pass
point = Child(955)
point.__index__ = lambda: 66
print(bin(point), oct(point), hex(point), chr(point), events)
events.clear()
convert = hex
def capture(fn):
    def apply(value):
        return fn(value)
    return apply
print(capture(convert)(Index(-255)))
print(chr(*(Index(127757),)), events)
events.clear()
for value in (-2147483649, -2147483648, -1, 0, 1114111, 1114112, 2147483647, 2147483648):
    try:
        print(value, ascii(chr(Index(value))))
    except (ValueError, OverflowError) as error:
        print(value, type(error).__name__, str(error))
print(events)
class Invalid:
    def __index__(self):
        return '65'
try:
    chr(Invalid())
except TypeError as error:
    print(type(error).__name__, str(error))
class Missing:
    pass
missing = Missing()
missing.__index__ = lambda: 65
try:
    bin(missing)
except TypeError as error:
    print(type(error).__name__, str(error))
