36 lines
893 B
Python
36 lines
893 B
Python
from asyncio import Future
|
|
from typing import Callable, Mapping, Optional, TypeVar, Union
|
|
|
|
from reactivex import Observable, abc, defer, empty, from_future
|
|
|
|
_Key = TypeVar("_Key")
|
|
_T = TypeVar("_T")
|
|
|
|
|
|
def case_(
|
|
mapper: Callable[[], _Key],
|
|
sources: Mapping[_Key, Observable[_T]],
|
|
default_source: Optional[Union[Observable[_T], "Future[_T]"]] = None,
|
|
) -> Observable[_T]:
|
|
|
|
default_source_: Union[Observable[_T], "Future[_T]"] = default_source or empty()
|
|
|
|
def factory(_: abc.SchedulerBase) -> Observable[_T]:
|
|
try:
|
|
result: Union[Observable[_T], "Future[_T]"] = sources[mapper()]
|
|
except KeyError:
|
|
result = default_source_
|
|
|
|
if isinstance(result, Future):
|
|
|
|
result_: Observable[_T] = from_future(result)
|
|
else:
|
|
result_ = result
|
|
|
|
return result_
|
|
|
|
return defer(factory)
|
|
|
|
|
|
__all__ = ["case_"]
|