{-# LANGUAGE BangPatterns #-}

import System.Environment
import Control.Applicative
import Data.List
import Data.Ord
import qualified Data.Map as M
import qualified Data.ByteString.Char8 as S

import Data.ByteString.Internal
import Data.ByteString.Unsafe
import Foreign
import Data.Binary
import Codec.Compression.GZip
import qualified Data.ByteString.Lazy as L

main = do
    f <- head <$> getArgs
    x <- S.readFile f
    let t = foldl' count M.empty (S.words x) :: M.Map S.ByteString Int
    L.writeFile "binary.dat" . compress . encode $ t

count counts word = M.insertWith' (+) (word) 1 counts
