| from typing import Callable, Generic, Optional, TypeVar |
| |
| |
| R = TypeVar("R") |
| |
| |
| class Thunk(Generic[R]): |
| """ |
| A simple lazy evaluation implementation that lets you delay |
| execution of a function. It properly handles releasing the |
| function once it is forced. |
| """ |
| |
| f: Optional[Callable[[], R]] |
| r: Optional[R] |
| |
| __slots__ = ["f", "r"] |
| |
| def __init__(self, f: Callable[[], R]): |
| self.f = f |
| self.r = None |
| |
| def force(self) -> R: |
| if self.f is None: |
| return self.r # type: ignore[return-value] |
| self.r = self.f() |
| self.f = None |
| return self.r |