def evaluate()

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("")