from datetime import timedelta
from typing import Any, Callable, NoReturn, TypeVar, Union

from jcutil.defines import Writable

T = TypeVar('T')


def mem_cache(cache_dir: str = ...) -> Callable: ...

def clear_mem(path: str = ..., cache_dir: str = ...) -> NoReturn: ...

def redis_cache(expires: Union[int, timedelta], prefix: str = ...,
                redis_connector: Callable = ...,
                result_assert: Callable[[Any], bool] = ...,
                ) -> Callable[[Callable], Any]: ...

def persistence(fs: Union[Writable, Callable[[], Writable]], f: Callable[..., T]) \
        -> Callable[..., T]: ...
