refactoring: factored out queue processor fom lazy bufferizer
This commit is contained in:
parent
c8579a8ad0
commit
abc56e6d9f
@ -1,11 +1,12 @@
|
|||||||
import logging
|
import logging
|
||||||
|
from collections import deque
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
from typing import Union, Any
|
from typing import Union, Any
|
||||||
|
|
||||||
from funcy import flatten, compose
|
from funcy import flatten, compose
|
||||||
|
|
||||||
from pyinfra.server.dispatcher.dispatcher import Nothing
|
|
||||||
from pyinfra.server.bufferizer.buffer import bufferize
|
from pyinfra.server.bufferizer.buffer import bufferize
|
||||||
|
from pyinfra.server.dispatcher.dispatcher import Nothing
|
||||||
from pyinfra.utils.func import lift
|
from pyinfra.utils.func import lift
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -14,12 +15,24 @@ logger = logging.getLogger(__name__)
|
|||||||
class LazyBufferizer:
|
class LazyBufferizer:
|
||||||
def __init__(self, fn, buffer_size=3):
|
def __init__(self, fn, buffer_size=3):
|
||||||
"""Function `fn` has to return an iterable, ideally is a generator and needs to be mappable."""
|
"""Function `fn` has to return an iterable, ideally is a generator and needs to be mappable."""
|
||||||
self.input_queue = chain([])
|
self.input_queue = deque()
|
||||||
self.fn = bufferize(fn, buffer_size=buffer_size, null_value=[])
|
self.queue_processor = QueueProcessor(bufferize(fn, buffer_size=buffer_size, null_value=[]), self.input_queue)
|
||||||
self.result_stream = chain([])
|
|
||||||
|
|
||||||
def submit(self, package, **kwargs) -> None:
|
def submit(self, package, **kwargs) -> None:
|
||||||
self.input_queue = chain(self.input_queue, [package])
|
self.input_queue.append(package)
|
||||||
|
|
||||||
|
def compute_next(self):
|
||||||
|
return self.queue_processor.compute_next()
|
||||||
|
|
||||||
|
|
||||||
|
class QueueProcessor:
|
||||||
|
def __init__(self, fn, queue):
|
||||||
|
self.fn = fn
|
||||||
|
self.input_queue = queue
|
||||||
|
self.result_stream = chain([])
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
return self.compute_next()
|
||||||
|
|
||||||
def compute_next(self) -> Union[Nothing, Any]:
|
def compute_next(self) -> Union[Nothing, Any]:
|
||||||
try:
|
try:
|
||||||
@ -30,7 +43,14 @@ class LazyBufferizer:
|
|||||||
except TypeError as err:
|
except TypeError as err:
|
||||||
raise TypeError("Function failed with type error. Is it mappable?") from err
|
raise TypeError("Function failed with type error. Is it mappable?") from err
|
||||||
|
|
||||||
def compute(self):
|
def stream_queue(self):
|
||||||
items = chain(self.input_queue, [Nothing])
|
while True:
|
||||||
yield from compose(flatten, lift(self.fn))(items)
|
if self.input_queue:
|
||||||
|
yield self.input_queue.popleft()
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
yield Nothing
|
||||||
|
|
||||||
|
def compute(self):
|
||||||
|
yield from compose(flatten, lift(self.fn))(self.stream_queue())
|
||||||
yield Nothing
|
yield Nothing
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user