# SPDX-License-Identifier: MIT
# https://docs.python.org/3.9/reference/expressions.html#generator-expressions
events = []
def outer():
    events.append("outer")
    return [1, 2, 3]
def inner(value):
    events.append("inner:" + str(value))
    return range(value, value + 2)
def keep(value):
    events.append("keep:" + str(value))
    return value % 2 == 1
def element(left, right):
    events.append("element:" + str(left) + ":" + str(right))
    return left * 10 + right
cursor = (element(left, right) for left in outer() if keep(left) for right in inner(left) if keep(right))
print(type(cursor).__name__, events)
alias = iter(cursor)
print(alias is cursor, next(cursor), events)
print(next(alias), events)
print(list(cursor), next(alias, -1), events)
print(list(x * 100 + y * 10 + z for x in range(2) for y in range(3) if y != 1 for z in range(y)))
print(list(left + right for left in "é雪" for right in "😀a"))
print(list(left + right for left in b"\x00\xff" for right in (1, 2)))
print(list(value for value in range(3) for empty in ()))
print(list(None for left in range(2) for right in range(2)))
print(sum(left * right for left in range(4) for right in range(3)))
print(all(left != right for left in range(2) for right in range(2)))
print(any(left == right for left in range(2) for right in range(2)))
print(sorted(left - right for left in range(3) for right in range(2)))
print(list(enumerate(left + right for left in range(2) for right in range(2))))
print(list(filter(bool, (left + right for left in range(2) for right in range(2)))))
