curse.py

curse.py (797 bytes)

from dataclasses import dataclass
import functools
import typing

@dataclass(frozen=True)
class Cursed[T ,R]:
    fun: typing.Callable[[T], R]

    @typing.overload
    def __ror__(self, arg: T, /) -> R:
        ...

    @typing.overload
    def __ror__(self, arg: list[T], /) -> list[R]:
        ...

    def __ror__(self, arg):
        if isinstance(arg, list):
            return [self(ai) for ai in arg]
        return self.fun(arg)        


    def __call__(self, arg: T) -> R:
        return self.fun(arg)

    def __repr__(self) -> str:
        return f"<Cursed wrapper of {self.fun.__name__}>"

#@functools.wraps
def curse(f):
    return Cursed(f)

if __name__ == '__main__':
    abs = curse(abs)
    print(abs)
    print(abs(-3))
    print(-3 | abs)
    print([1, -3, 9, -27] | abs)