From 6b6a9b530a304020b58e64891c0e8741ca124b98 Mon Sep 17 00:00:00 2001 From: Edward Amsden Date: Thu, 20 Oct 2016 10:25:37 -0400 Subject: [PATCH 1/2] Add evalListT to get results from ListT as a list --- src/Pipes.hs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Pipes.hs b/src/Pipes.hs index 91071c0..63e4419 100644 --- a/src/Pipes.hs +++ b/src/Pipes.hs @@ -46,6 +46,7 @@ module Pipes ( -- * ListT , ListT(..) , runListT + , evalListT , Enumerable(..) -- * Utilities @@ -78,7 +79,9 @@ import Control.Monad.Writer (MonadWriter(..)) import Control.Monad.Zip (MonadZip(..)) import Pipes.Core import Pipes.Internal (Proxy(..)) +import Pipes.Lift (writerP, execWriterP) import qualified Data.Foldable as F +import qualified Control.Monad as M #if MIN_VERSION_base(4,8,0) import Control.Applicative (Alternative(..)) @@ -566,6 +569,14 @@ runListT :: Monad m => ListT m a -> m () runListT l = runEffect (enumerate (l >> mzero)) {-# INLINABLE runListT #-} +-- | Run a self-contained `ListT` computation and accumulate the produced values as a list in the underlying monad +evalListT :: Monad m => ListT m a -> m [a] +evalListT listT = + runEffect + $ execWriterP + $ (writerP $ (\() -> ((), [])) <$> (enumerate $ listT >> mzero)) + >-> (M.forever $ pass ((\element -> ((), (element :))) <$> await)) + {-| 'Enumerable' generalizes 'Data.Foldable.Foldable', converting effectful containers to 'ListT's. From bb96432ec23f5e03f08a111a9bc73f0d8cb1c3ee Mon Sep 17 00:00:00 2001 From: Edward Amsden Date: Thu, 20 Oct 2016 10:44:01 -0400 Subject: [PATCH 2/2] Make evalListT actually return the list and not an empty list --- src/Pipes.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pipes.hs b/src/Pipes.hs index 63e4419..9d43247 100644 --- a/src/Pipes.hs +++ b/src/Pipes.hs @@ -574,7 +574,7 @@ evalListT :: Monad m => ListT m a -> m [a] evalListT listT = runEffect $ execWriterP - $ (writerP $ (\() -> ((), [])) <$> (enumerate $ listT >> mzero)) + $ (writerP $ (\() -> ((), [])) <$> enumerate listT) >-> (M.forever $ pass ((\element -> ((), (element :))) <$> await)) {-| 'Enumerable' generalizes 'Data.Foldable.Foldable', converting effectful