Нам нужна функция, которая вставляет одну задержку в конец потока чанка и передает эту функцию в maps
.
delay
здесь не работает, потому что он помещает задержки между каждым полученным значением.Но мы можем сделать это легко, используя функции из Applicative
:
S.print
$ concats
$ S.maps (\s -> s <* liftIO (threadDelay 1000000))
$ chunksOf 2
$ S.each [1..10]
Что здесь происходит?maps
применяет преобразование к «базовому функтору» Stream
.В «кусочном потоке», полученном с помощью chunksOf
, этот базовый функтор сам по себе является a Stream
.Кроме того, преобразование должно сохранять возвращаемое значение Stream
.
Stream
s может быть упорядочено с помощью таких функций, как (>>=) :: Stream f m a -> (a -> Stream f m b) -> Stream f m b
, если следующий поток зависит от конечного результатапредыдущий или с такими функциями, как (<*) :: Stream f m a -> Stream f m b -> Stream f m a
, если это не так.(<*)
сохраняет возвращаемое значение первого Stream
, что нам и нужно в этом случае.
Мы не хотим выдавать больше элементов, а только вводим эффект задержки, поэтому мы простоliftIO
эффект в монаде Stream
.
Другой способ вставить задержки после каждого полученного значения Stream
- застегнуть с бесконечный список задержек:
delay' :: MonadIO m => Int -> Stream (Of a) m r -> Stream (Of a) m r
delay' micros s = S.zipWith const s (S.repeatM (liftIO (threadDelay micros)))