mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-14 15:35:55 +08:00
feat(api): Add some utility functions for working with generators
This commit is contained in:
parent
3b45b87d02
commit
4cf9d23069
53
api/libs/gen_utils.py
Normal file
53
api/libs/gen_utils.py
Normal file
@ -0,0 +1,53 @@
|
||||
"""Utility functions for working with generators."""
|
||||
|
||||
import logging
|
||||
from collections.abc import Callable, Generator
|
||||
from inspect import isgenerator
|
||||
from typing import TypeVar
|
||||
|
||||
_YieldT = TypeVar("_YieldT")
|
||||
_YieldR = TypeVar("_YieldR")
|
||||
|
||||
_T = TypeVar("_T")
|
||||
|
||||
|
||||
def inspect(gen_or_normal: _T, logger: logging.Logger) -> _T:
|
||||
if not isgenerator(gen_or_normal):
|
||||
return gen_or_normal
|
||||
|
||||
def wrapper():
|
||||
for item in gen_or_normal:
|
||||
logger.info(
|
||||
"received generator item, type=%s, value=%s",
|
||||
type(item),
|
||||
item,
|
||||
)
|
||||
yield item
|
||||
|
||||
return wrapper()
|
||||
|
||||
|
||||
def map_(
|
||||
gen: Generator[_YieldT, None, None],
|
||||
mapper: Callable[[_YieldT], _YieldR],
|
||||
) -> Generator[_YieldR, None, None]:
|
||||
for item in gen:
|
||||
yield mapper(item)
|
||||
|
||||
|
||||
def filter_(
|
||||
gen: Generator[_YieldT, None, None],
|
||||
mapper: Callable[[_YieldT], bool],
|
||||
) -> Generator[_YieldT, None, None]:
|
||||
for item in gen:
|
||||
if mapper(item):
|
||||
yield item
|
||||
|
||||
|
||||
def wrap(
|
||||
gen: Generator[_YieldT, None, None],
|
||||
funcs: list[Callable[[Generator[_YieldT, None, None]], Generator[_YieldT, None, None]]],
|
||||
) -> Generator[_YieldT, None, None]:
|
||||
for f in funcs:
|
||||
gen = f(gen)
|
||||
return gen
|
Loading…
x
Reference in New Issue
Block a user