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
|