{-# LANGUAGE OverloadedStrings #-}
module Test1
( tests
)
where
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import qualified Data.Map as M
import qualified Data.List as L
import qualified Data.Foldable as F
import qualified Control.Foldl as FL
import qualified Control.MapReduce.Simple as MR
import qualified Control.MapReduce.Engines.List
as MRL
import qualified Control.MapReduce.Engines.Vector
as MRV
import qualified Control.MapReduce.Engines.Streamly
as MRSY
import qualified Control.MapReduce.Engines.Streaming
as MRSG
-- for reference
direct :: [Int] -> M.Map Bool Int
direct = M.fromListWith (+) . fmap (\x -> (x `mod` 3 == 0, x)) . L.filter even
unpack = MR.filterUnpack even -- filter, keeping even numbers
-- assign each number a key of True or False depending on whether it's a multiple of 3. Group the number itself.
isMultipleOf3 x = (x `mod` 3) == 0
assign = MR.assign isMultipleOf3 id
reduce = MR.foldAndLabel FL.sum M.singleton -- sum each group and then create a singleton Map for later combining
mrFoldList :: FL.Fold Int (M.Map Bool Int)
mrFoldList =
fmap F.fold $ MRL.listEngine MRL.groupByHashableKey unpack assign reduce
mrFoldVector :: FL.Fold Int (M.Map Bool Int)
mrFoldVector =
fmap F.fold $ MRV.vectorEngine MRV.groupByHashableKey unpack assign reduce
mrFoldStreamly :: FL.Fold Int (M.Map Bool Int)
mrFoldStreamly = MRSY.concatStreamFold
$ MRSY.streamlyEngine MRSY.groupByHashableKey unpack assign reduce
mrFoldStreaming :: FL.Fold Int (M.Map Bool Int)
mrFoldStreaming = MRSG.concatStreamFold
$ MRSG.streamingEngine MRSG.groupByHashableKey unpack assign reduce
prop_mrSame :: FL.Fold Int (M.Map Bool Int) -> Property
prop_mrSame mrF = property $ do
xs <- forAll $ Gen.list (Range.linear 0 100) $ Gen.int (Range.linear 0 10000)
direct xs === FL.fold mrF xs
tests :: Group
tests = Group
"Test 1"
[ ("[] Engine" , prop_mrSame mrFoldList)
, ("Vector Engine" , prop_mrSame mrFoldVector)
, ("Streamly Engine" , prop_mrSame mrFoldStreamly)
, ("Streaming Engine", prop_mrSame mrFoldStreaming)
]