Beispiel #1
0
def object_from_module(mod: ModuleType, pred: Callable[[Any], bool],
                       desc: str) -> Do:
    all = yield Maybe.getattr(mod, '__all__').to_either(
        f'module `{mod.__name__}` does not define `__all__`')
    yield (Lists.wrap(all).flat_map(L(Maybe.getattr)(
        mod,
        _)).find(pred).to_either(f'no {desc} in `{mod.__name__}.__all__`'))
Beispiel #2
0
def type_arg(tpe: type, index: int) -> Do:
    def error() -> str:
        return f'{tpe} has no type args'

    raw = yield Maybe.getattr(tpe, '__args__').to_either_f(error)
    types = yield Right(Lists.wrap(raw)) if isinstance(
        raw, Iterable) else Left(error())
    yield types.lift(index).to_either_f(
        lambda: f'{tpe} has less than {index + 1} args')
Beispiel #3
0
def objects_from_module(mod: ModuleType, pred: Callable[[Any], bool]) -> Do:
    all = yield Maybe.getattr(mod, '__all__').to_either(
        f'module `{mod.__name__}` does not define `__all__`')
    return (Lists.wrap(all).flat_map(L(Maybe.getattr)(mod, _)).filter(pred))
Beispiel #4
0
 def _dat__values(self) -> List[Any]:
     return (self._dat__fields.traverse(
         lambda a: Maybe.getattr(self, a.name),
         Maybe).get_or_fail(lambda: f'corrupt `Dat`: {type(self)}'))
Beispiel #5
0
def list_type_decoder(ltpe: Type[Collection]) -> Do:
    args = yield Maybe.getattr(ltpe, '__args__').map(Lists.wrap)
    tpe = yield args.head
    decoder = yield Decoder.m(tpe)
    return tpe, decoder