# SPDX-License-Identifier: MIT
print(ord('A'), ord('\0'), ord('é'), ord('λ'), ord('€'), ord('🌍'))
print(ord(b'A'), ord(b'\0'), ord(b'\x80'), ord(b'\xff'))
print(ord('\u007f'), ord('\u0080'), ord('\u07ff'), ord('\u0800'))
print(ord('\ud7ff'), ord('\ue000'), ord('\uffff'), ord('\U00010000'), ord('\U0010ffff'))

events = []
def character():
    events.append('character')
    return 'λ'
print(ord(character()), events)
events.clear()
def failed():
    events.append('failed')
    raise ValueError('source failed')
try:
    ord(failed())
except ValueError as error:
    print(type(error).__name__, str(error), events)

code = ord
print(code('é'), code(*('🌍',)))
def factory(convert):
    def apply(value):
        return convert(value)
    return apply
captured = factory(code)
print(captured('€'), captured(b'\xff'))
print(isinstance(code('A'), int), isinstance(code('A'), bool))

for text in ('', 'ab', 'éλ', 'e\u0301', '🌍🌎'):
    try:
        print(ord(text))
    except TypeError as error:
        print(type(error).__name__, str(error))
for data in (b'', b'ab', b'\xff\0'):
    try:
        print(ord(data))
    except TypeError as error:
        print(type(error).__name__, str(error))

def wrong():
    events.append('wrong')
    return 42
events.clear()
try:
    ord(wrong())
except TypeError as error:
    print(type(error).__name__, str(error), events)

class Character:
    def __str__(self):
        events.append('str')
        return 'A'
events.clear()
try:
    ord(Character())
except TypeError as error:
    print(type(error).__name__, str(error), events)
