@@ -49,20 +49,29 @@ isAlpha c
49 uc = fromIntegral (Char.ord c) :: Word
49 uc = fromIntegral (Char.ord c) :: Word
51main :: IO ()
51main :: IO ()
53+ name <- fmap head getArgs
54+ src <- openFile name ReadMode
56+ -- Write the stream to a hashmap consisting of word counts
54− alter Nothing = fmap Just $ newIORef (1 :: Int)
59+ alter Nothing = fmap Just $ newIORef (1 :: Int)
55− alter (Just ref) = modifyIORef' ref (+ 1) >> return (Just ref)
60+ alter (Just ref) = modifyIORef' ref (+ 1) >> return (Just ref)
57− name <- fmap head getArgs
58− src <- openFile name ReadMode
59− Streamly.unfold FH.read src -- SerialT IO Word8
61+ in Streamly.unfold FH.read src -- SerialT IO Word8
60 & Streamly.decodeLatin1 -- SerialT IO Char
62 & Streamly.decodeLatin1 -- SerialT IO Char
61− & Streamly.map toLower -- SerialT IO Char
63+ & Streamly.map toLower -- SerialT IO Char
62− & Streamly.words FL.toList -- SerialT IO String
64+ & Streamly.words FL.toList -- SerialT IO String
63− & Streamly.filter (all isAlpha)
65+ & Streamly.filter (all isAlpha) -- SerialT IO String
64− & Streamly.foldlM' (flip (Map.alterF alter)) Map.empty
66+ & Streamly.foldlM' (flip (Map.alterF alter)) Map.empty -- IO (Map String (IORef Int))
68+ -- Print the top hashmap entries
70+ let readRef (w, ref) = do
66− >>= mapM (\(w, ref) -> readIORef ref >>= \cnt -> return (w, cnt))
71+ cnt <- readIORef ref
67− & fmap (List.take 25 . List.sortOn (Ord.Down . snd))
76+ traverse_ print $ List.sortOn (Ord.Down . snd) counts
68− >>= traverse_ print
77+ & List.take 25