{-# LANGUAGE RankNTypes #-}
{- |
Module : Main
Description : Basic conversion tests
Copyright : Ivan Lazar Miljenovic
License : MIT
Maintainer : Ivan.Miljenovic@gmail.com
-}
module Main (main) where
import Streaming.Conduit
import qualified Data.Conduit as C
import qualified Data.Conduit.List as C
import qualified Streaming as S
import qualified Streaming.Prelude as S
import Test.Hspec
import Test.Hspec.QuickCheck
import Data.Functor.Identity (Identity, runIdentity)
--------------------------------------------------------------------------------
main :: IO ()
main = hspec $ do
describe "Stream -> Conduit" $ do
prop "fromStream" $
testPipeline (\xs f -> conduitList (fromStream (S.each xs) C..| C.map f))
prop "fromStreamProducer" $
testPipeline (\xs f -> conduitList (fromStreamProducer (S.each xs) C..| C.map f))
prop "asConduit" $
testPipeline (\xs f -> conduitList (C.sourceList xs C..| asConduit (S.map f)))
describe "Conduit -> Stream" $ do
prop "toStream" $
testPipeline (\xs f -> streamList . S.map f $ toStream (C.sourceList xs))
prop "asStream" $
testPipeline (\xs f -> streamList . asStream (C.map f) $ S.each xs)
prop "sinkStream" $
testPipeline (\xs f -> runIdentity $ sinkStream C.consume $ S.map f $ S.each xs)
conduitList :: C.Source Identity a -> [a]
conduitList = runIdentity . C.sourceToList
streamList :: S.Stream (S.Of a) Identity () -> [a]
streamList = runIdentity . S.toList_
testPipeline :: (forall a. [a] -> (a -> a) -> [a]) -> [Int] -> Bool
testPipeline pipeline xs = pipeline xs plusOne == map plusOne xs
plusOne :: Int -> Int
plusOne = (+1)