# SPDX-License-Identifier: MIT
print(list(reversed([1, 2, 3])))
print(list(reversed((True, False, True))))
print(list(reversed("Aé雪😀\x00")))
print(list(reversed(b"\x00\x7f\x80\xff")))
print(list(reversed([])), list(reversed(())), list(reversed("")), list(reversed(b"")))
print(list(reversed(range(2, 12, 3))), list(reversed(range(9, -2, -3))))
print(list(enumerate(reversed("é😀"), 10)))
print(list(zip(reversed((1, 2, 3)), reversed("abc"))))
print([value * 2 for value in reversed([1, 2, 3])])
print(type(reversed([1])).__name__, type(reversed((1,))).__name__)
print(type(reversed("é")).__name__, type(reversed(b"\xff")).__name__)

values = [0, 1, 2]
backward = reversed(values)
print(iter(backward) is backward)
values.append(3)
print(next(backward))
values[1] = 10
print(next(backward))
values.insert(0, 99)
print(next(backward), next(backward, -1))
values.append(4)
print(next(backward, -1), values)

shrunk = [10, 20, 30]
shrink_iterator = reversed(shrunk)
shrunk.pop()
print(next(shrink_iterator, -1))
shrunk.append(99)
print(next(shrink_iterator, -1))
restored_iterator = reversed(shrunk)
shrunk.pop()
shrunk.append(40)
print(list(restored_iterator))

original = [7, 8, 9]
captured = reversed(original)
original = [100]
print(list(captured), original)
text = "oldé"
backward_text = reversed(text)
text = "new"
print(list(backward_text), text)

empty = []
backward_empty = reversed(empty)
empty.append(1)
print(list(backward_empty), empty)

calls = 0
def source():
    global calls
    calls += 1
    return [3, 4]
reverse = reversed
def make_reverser(operation):
    def apply(value):
        return operation(value)
    return apply
apply = make_reverser(reverse)
print(list(apply(source())), calls)
print(list(reverse(*((5, 6),))))

single = reversed([1])
print(next(single))
try:
    next(single)
except StopIteration:
    print("stopped")
print(next(single, -1))
print(type(single).__name__)

huge = 10 ** 100
backward_huge = reversed(range(-huge, huge, 3))
print(next(backward_huge), next(backward_huge), next(backward_huge))
backward_huge = reversed(range(huge, -huge, -5))
print(next(backward_huge), next(backward_huge), next(backward_huge))
