-- | A word frequency count using the different string types
--
-- Tested in this benchmark:
--
-- * Splitting into words
--
-- * Converting to lowercase
--
-- * Comparing: Eq/Ord instances
--
module Benchmarks.WordFrequencies
    ( initEnv
    , benchmark
    ) where

import Data.Foldable (Foldable(..))
import Data.Map (Map)
import Prelude hiding (Foldable(..))
import Test.Tasty.Bench (Benchmark, bench, bgroup, whnf)
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Data.Text.IO as T

type Env = T.Text

initEnv :: FilePath -> IO Env
initEnv fp = do
    t <- T.readFile fp
    return t

benchmark :: Env -> Benchmark
benchmark ~t =
    bgroup "WordFrequencies"
        [ bench "Text"       $ whnf (frequencies . T.words . T.toLower)     t
        ]

frequencies :: Ord a => [a] -> Map a Int
frequencies = foldl' (\m k -> M.insertWith (+) k 1 m) M.empty
