packages feed

dlist-nonempty-0.1: bench/Main.hs

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]
        ]
    ]