41 lines
1.2 KiB
Haskell
41 lines
1.2 KiB
Haskell
module Main where
|
|
|
|
import Control.Category -- (>>>)
|
|
import Data.Char -- toLower, isSpace
|
|
import Data.List -- sortBy, (Foldable(foldl')), filter -- '
|
|
import Data.Ord -- Down
|
|
import System.IO -- stdin, ReadMode, openFile, hClose
|
|
import System.Environment -- getArgs
|
|
|
|
-- containers
|
|
import Data.Map.Strict (Map)
|
|
import qualified Data.Map.Strict as M
|
|
import qualified Data.IntMap.Strict as IM
|
|
|
|
-- text
|
|
import Data.Text (Text)
|
|
import qualified Data.Text as T
|
|
import qualified Data.Text.IO as T
|
|
|
|
frequencies :: Ord a => [a] -> Map a Integer
|
|
frequencies = foldl' (\m k -> M.insertWith (+) k 1 m) M.empty -- '
|
|
{-# SPECIALIZE frequencies :: [Text] -> Map Text Integer #-}
|
|
|
|
main :: IO ()
|
|
main = do
|
|
args <- getArgs
|
|
(n,hand,filep) <- case length args of
|
|
0 -> return (10,stdin,False)
|
|
1 -> return (read $ head args,stdin,False)
|
|
_ -> let (ns:fp:_) = args
|
|
in fmap (\h -> (read ns,h,True)) (openFile fp ReadMode)
|
|
T.hGetContents hand >>=
|
|
(T.map toLower
|
|
>>> T.split isSpace
|
|
>>> filter (not <<< T.null)
|
|
>>> frequencies
|
|
>>> M.toList
|
|
>>> sortBy (comparing (Down <<< snd)) -- sort the opposite way
|
|
>>> take n
|
|
>>> print)
|
|
when filep (hClose hand)
|