Как объединить два Потребителя в один в 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-й аргумент какstderr2-й аргумент как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

Спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос