{-# LANGUAGE TypeApplications #-} import Data.Semigroup (Sum (Sum)) import Streaming.NonEmpty (groupSemigroupBy, groupSemigroupByPure) import qualified Streaming.Prelude as S import Test.Hspec main :: IO () main = hspec $ do describe "groupSemigroupBy" $ do it "collapse no stream" $ do xs S.:> () <- S.toList $ groupSemigroupBy (==) $ S.each ([] @(Sum Int)) xs `shouldBe` [] it "collapse one elem stream" $ do xs S.:> () <- S.toList $ groupSemigroupBy (==) $ S.each [Sum 1] xs `shouldBe` [Sum 1] it "collapse 2 elems of different groups stream" $ do xs S.:> () <- S.toList $ groupSemigroupBy (==) $ S.each [Sum 1, Sum 2] xs `shouldBe` [Sum 1, Sum 2] it "collapse 2 elems of same group stream " $ do xs S.:> () <- S.toList $ groupSemigroupBy (==) $ S.each [Sum 1, Sum 1] xs `shouldBe` [Sum 2] it "collapse 4 elems of 2 groups stream" $ do xs S.:> () <- S.toList $ groupSemigroupBy (==) $ S.each [Sum 1, Sum 1, Sum 2, Sum 2] xs `shouldBe` [Sum 2, Sum 4] describe "groupSemigroupByPure" $ do it "collapse 4 elems of group 2 stream" $ do groupSemigroupByPure (==) [Sum 1, Sum 1, Sum 2, Sum 2] `shouldBe` [Sum 2, Sum 4]