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