# SPDX-License-Identifier: MIT
# Views retain their mapping and reflect subsequent mutation.
data = {'alpha': 1, 'beta': 2}
keys = data.keys()
values = data.values()
items = data.items()
snapshot = list(items)
print(keys, values, items, len(keys), bool(values))
data['alpha'] = 10
data['gamma'] = 3
print(keys, values, items, snapshot)
print('gamma' in keys, 'missing' not in keys, 10 in values, 1 not in values)
print(('alpha', 10) in items, ('beta', 99) not in items)
print(keys is keys, keys is data.keys(), list(data))
for key in data:
    data[key] += 1
    print(key, data[key])
else:
    print('keys complete')
for key, value in items:
    if key == 'beta':
        continue
    print(key, value)
else:
    print('items complete')
for value in values:
    print(value)
    break
else:
    print('unreachable')
print([key for key in keys], [value * 2 for value in values])
print({key: value * 10 for key, value in items if value > 3})
number = 99
squares = {number: number * number for number in range(5) if number % 2 == 0}
print(squares, number)
print({a + b: a * b for a in range(2) for b in range(2)})
def mark_key(n):
    print('key', n)
    return n
def mark_value(n):
    print('value', n)
    return n * 3
print({mark_key(n): mark_value(n) for n in range(2)})
del data['beta']
print(keys, values, items, len(items))
try:
    del data['beta']
except KeyError as error:
    print(repr(error))
try:
    for key in data:
        data['delta'] = 4
except RuntimeError as error:
    print(str(error))
print(list(data))
try:
    for key, value in items:
        del data[key]
except RuntimeError as error:
    print(str(error))
print(list(data))
data.clear()
print(keys, values, items, len(keys), bool(items))
data['fresh'] = 7
print(keys, values, items)
# A view can be created while types are unknown; the later read is live.
later = {}
later_keys = later.keys()
later['ready'] = 1
print(later_keys)
# A returned view keeps its original dictionary alive.
def make_view():
    local = {'saved': 42}
    return local.items()
retained = make_view()
print(retained)
