import Criterion.Main import Prelude () import Prelude.Compat import Data.List (foldl') import Data.Foldable (toList) import Data.Semigroup (Semigroup (..)) import Data.DList.Instances () import qualified Data.List.NonEmpty as NE import qualified Data.DList as DList import qualified Data.DList.NonEmpty as NEDList sum' :: (Semigroup (f Int), Foldable f) => Int -> f Int -> Int sum' m x = foldl' (+) 0 $ toList $ go x m where go y n | n <= 0 = y | otherwise = go (y <> x) (n - 1) main :: IO () main = defaultMain [ bgroup "append 1000" [ bench "List" $ whnf (sum' 1000) $ [1,2,3,4,5] , bench "NonEmpty" $ whnf (sum' 1000) $ 1 NE.:| [2,3,4,5] , bench "DList" $ whnf (sum' 1000) $ DList.fromList [1,2,3,4,5] , bench "NonEmptyDList" $ whnf (sum' 1000) $ NEDList.fromNonEmpty $ 1 NE.:| [2,3,4,5] ] ]