2{-# LANGUAGE FlexibleInstances #-}
3#if __GLASGOW_HASKELL__ >= 800
4{-# OPTIONS_GHC -Wno-orphans #-}
7-- ghc -O2 -fspec-constr-recursive=10 -fmax-worker-args=16 word-classifier.hs
9import qualified Data.Char as Char
11import Data.Function ((&))
12import Data.Functor.Identity (Identity(..))
13import qualified Data.HashMap.Strict as Map
16import qualified Data.List as List
17import qualified Data.Ord as Ord
18import Foreign.Storable (Storable(..))
19import qualified Streamly.Data.Unicode.Stream as S
20import qualified Streamly.Internal.Data.Unicode.Stream as S
21import qualified Streamly.Data.Fold as FL
22import qualified Streamly.Internal.Data.Fold as IFL
23import qualified Streamly.Internal.Data.Unfold as IUF
24import qualified Streamly.Internal.FileSystem.File as File
25import qualified Streamly.Memory.Array as A
26import qualified Streamly.Prelude as S
27import System.Environment (getArgs)
29instance (Enum a, Storable a) => Hashable (A.Array a) where
30 hash arr = runIdentity $ IUF.fold A.read IFL.rollingHash arr
31 hashWithSalt salt arr = runIdentity $
32 IUF.fold A.read (IFL.rollingHashWithSalt salt) arr
35toLower :: Char -> Char
37 | uc >= 0x61 && uc <= 0x7a = c
38 | otherwise = Char.toLower c
40 uc = fromIntegral (Char.ord c) :: Word
43isAlpha :: Char -> Bool
45 | uc >= 0x61 && uc <= 0x7a = True
46 | otherwise = Char.isAlpha c
48 uc = fromIntegral (Char.ord c) :: Word
52 inFile <- fmap head getArgs
54 -- Write the stream to a hashmap consisting of word counts
57 alter Nothing = fmap Just $ newIORef (1 :: Int)
58 alter (Just ref) = modifyIORef' ref (+ 1) >> return (Just ref)
59 in File.toBytes inFile -- SerialT IO Word8
60 & S.decodeLatin1 -- SerialT IO Char
61 & S.map toLower -- SerialT IO Char
62 & S.words FL.toList -- SerialT IO String
63 & S.filter (all isAlpha) -- SerialT IO String
64 & S.foldlM' (flip (Map.alterF alter)) Map.empty -- IO (Map String (IORef Int))
66 -- Print the top hashmap entries
68 let readRef (w, ref) = do
74 traverse_ print $ List.sortOn (Ord.Down . snd) counts
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list