packages feed

streaming-conduit-0.1.3.0: test/conversions.hs

{-# 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)