# SPDX-License-Identifier: MIT
# Independently authored; Python 3.9 print and evaluation-order contracts.
separator = ' / '
ending = '!\n'
print('alpha', 42, True, sep=separator, end=ending)
print('λ', '🌍', sep=''.join(['<', '>']), end=''.join([';', '\n']))
print('default', 'spacing', sep=None, end=None)
print(sep=separator, end=ending)

log = ''
def text(label, result):
    global log
    log += label
    return result

def absent(label):
    global log
    log += label
    return None

print(text('a', 'left'), text('b', 'right'), end=text('e', '.\n'), sep=text('s', '|'))
print(log)
log = ''
print('None', 'defaults', sep=absent('s'), end=absent('e'))
print(log)

class Word:
    def __str__(self):
        global separator, ending, log
        separator = 'changed'
        ending = 'changed'
        log += 'str'
        return 'word'

separator = ':'
ending = '.\n'
log = ''
print(Word(), 'tail', sep=separator, end=ending)
print(separator, ending, log)

log = ''
try:
    print(Word(), text('a', 'unused'), sep=17, end=text('e', '!'))
except TypeError as error:
    print(type(error).__name__, log)
log = ''
try:
    print(Word(), end=text('e', '!'), sep=absent('s') is None)
except TypeError as error:
    print(type(error).__name__, log)
try:
    print(end=b'bad')
except TypeError:
    print('empty call validates end')
try:
    print(sep=[], end=None)
except TypeError:
    print('empty call validates sep')

class Broken:
    def __str__(self):
        raise ValueError('conversion')

try:
    print('prefix', Broken(), sep=separator, end=ending)
except ValueError:
    print('caught conversion')

def fail():
    global log
    log += 'fail'
    raise ValueError('option')
    return ':'

log = ''
try:
    print(text('a', 'hidden'), sep=fail(), end=text('e', 'hidden'))
except ValueError:
    print(log)

writer = print
writer('alias', 'works', sep=separator, end='.\n')
writer(*('tuple', 'args'), **{'end': '.\n', 'sep': '/'})

def make_writer(delimiter):
    def emit(first, second):
        return writer(first, second, sep=delimiter, end='.\n')
    return emit

emit = make_writer('·')
print(emit('closure', 'output'))
print('direct', *('expanded', 'args'), **{'sep': '-', 'end': '.\n'})

try:
    print(end=17, sep=23)
except TypeError as error:
    print(str(error).startswith('sep'))
