Как объединить два Потребителя в один в Haskell Pipes?
Я использую библиотеку потоковой обработки Haskellтрубы написать инструмент командной строки. Каждое действие командной строки может выводить результат вstdout
и входит вstderr
сpipes
API.
я нуждаюсьConsumer
который имеет тип какConsumer (Either String String) m r
распечатать фрагмент данных (Left
вstderr
, Right
вstdout
) с одногоConsumer
.
Эта функцияconsumeEither
не имеет гибкости, поэтому я хочу улучшить ее.
consumeEither :: (MonadIO m) => Consumer (Either String String) m ()
consumeEither = do
eitherS <- await
case eitherS of
(Left l) -> for (yield l) (liftIO . (IO.hPutStrLn IO.stderr))
(Right r) -> for (yiled r) (liftIO . putStrLn)
Кроме того, было бы полезно предоставить функцию, которая занимает дваConsumer
и объединить их в одинConsumer
.
Кто-нибудь знает хороший пример или реализацию следующего интерфейса?
merge :: (Monad m) => Consumer a m r -> Consumer b m r -> Consumer (Either a b) m r
1-й аргумент какstderr
2-й аргумент какstdout
Использование функцииimport Pipes
import qualified Pipes.Prelude as P
import qualified System.IO as IO
stdoutOrErr :: Consumer (Either String String) IO ()
stdoutOrErr = merge (P.toHandle IO.stderr) P.stdoutLn
Спасибо