{-# LANGUAGE FlexibleContexts #-} module Helpers ( collect , interleaveSeqs ) where import Control.Monad (forever) import Control.Monad.Trans (lift) import Hedgehog hiding (collect) import Pipes ((>->)) import qualified Control.Monad.Writer as W import qualified Hedgehog.Gen as Gen import qualified Pipes collect :: Monad m => Pipes.Producer a m () -> m [a] collect producer = fmap snd . W.runWriterT . Pipes.runEffect $ Pipes.hoist lift producer >-> collector where collector :: W.MonadWriter [a] m => Pipes.Consumer a m () collector = forever $ do x <- Pipes.await W.tell [x] interleaveSeqs :: [a] -> [a] -> Gen [a] interleaveSeqs = go id where go :: ([a] -> [a]) -> [a] -> [a] -> Gen [a] go acc [] [] = pure $ acc [] go acc [] ys = pure $ acc ys go acc xs [] = pure $ acc xs go acc (x:xs) (y:ys) = Gen.choice [ go (acc . (x:)) xs (y:ys) , go (acc . (y:)) (x:xs) ys ]