49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
import atexit
|
|
import itertools
|
|
import select
|
|
import toml
|
|
from ._logger_ import log
|
|
from ._ansii_ import cl
|
|
from ._typing_ import *
|
|
|
|
def OverriderResolveFunc(func: Callable):
|
|
func.overrideResolve = True
|
|
return func
|
|
|
|
class Overrider(Dict):
|
|
__slots__ = ('__data__', )
|
|
__data__: dict[str, Any]
|
|
|
|
@property
|
|
def result(_):
|
|
for i in reversed(_.__data__.values()):
|
|
if i is not Undefined:
|
|
try:
|
|
if callable(i) and (i.overrideResolve is True or i.orr is True):
|
|
return i()
|
|
except AttributeError:
|
|
pass
|
|
return i
|
|
return Undefined
|
|
|
|
@property
|
|
def r(_):
|
|
return _.result
|
|
|
|
def __init__(_, *args, default: Any = Undefined):
|
|
_.__data__ = {'default': default} | {k: Undefined for k in args}
|
|
|
|
def __getattr__(_, key) -> Any:
|
|
return _.__data__[key]
|
|
|
|
def __getitem__(_, key) -> Any:
|
|
return _.__data__[key]
|
|
|
|
def __setattr__(_, key, val) -> None:
|
|
if key == '__data__':
|
|
return object.__setattr__(_, key, val)
|
|
elif key in _.__data__:
|
|
_.__data__[key] = val
|
|
else:
|
|
raise AttributeError()
|