29 lines
625 B
Python
29 lines
625 B
Python
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
|