in chz/blueprint/_lazy.py [0:0]
def evaluate(value_mapping: dict[str, Evaluatable]) -> Any:
assert "" in value_mapping
refs_in_progress = collections.OrderedDict[str, None]()
def inner(ref: str) -> Any:
if ref in refs_in_progress:
cycle = " -> ".join(list(refs_in_progress.keys())[1:] + [ref])
raise RecursionError(f"Detected cyclic reference: {cycle}")
refs_in_progress[ref] = None
try:
value = value_mapping[ref]
assert isinstance(value, Evaluatable)
if isinstance(value, Value):
return value.value
if isinstance(value, ParamRef):
try:
ret = inner(value.ref)
except Exception as e:
e.add_note(f" (when dereferencing {ref!r})")
raise
assert not isinstance(ret, Evaluatable)
value_mapping[ref] = Value(ret)
return ret
if isinstance(value, Thunk):
kwargs = {}
for k, v in value.kwargs.items():
assert isinstance(v, ParamRef)
try:
kwargs[k] = inner(v.ref)
except Exception as e:
e.add_note(f" (when evaluating argument {k!r} for {type_repr(value.fn)})")
raise
ret = value.fn(**kwargs)
return ret
finally:
item = refs_in_progress.popitem()
assert item[0] == ref
raise AssertionError
return inner("")