23 lines
675 B
Python
23 lines
675 B
Python
from typing import Callable, Any
|
|
|
|
class tailRecursion:
|
|
"""Tail-call optimization wrapper."""
|
|
|
|
f: Callable[..., Any]
|
|
args: tuple[Any, ...]
|
|
kwargs: dict[str, Any]
|
|
|
|
def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None:
|
|
self.f: Callable[..., Any] = func
|
|
self.args: tuple[Any, ...] = args
|
|
self.kwargs: dict[str, Any] = kwargs
|
|
|
|
def __call__(self) -> Any:
|
|
return self.f(*self.args, **self.kwargs)
|
|
|
|
@staticmethod
|
|
def eval(val: Any) -> Any:
|
|
"""Evaluate tail calls recursively until completion."""
|
|
while isinstance(val, tailRecursion):
|
|
val = val()
|
|
return val |