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 Streamly
20import qualified Streamly.Internal.Data.Unicode.Stream as Streamly
21import qualified Streamly.FileSystem.Handle as FH
22import qualified Streamly.Data.Fold as FL
23import qualified Streamly.Internal.Data.Fold as IFL
24import qualified Streamly.Internal.Data.Unfold as IUF
25import qualified Streamly.Memory.Array as A
26import qualified Streamly.Prelude as Streamly
27import System.Environment (getArgs)
28import System.IO (openFile, IOMode(..))
30instance (Enum a, Storable a) => Hashable (A.Array a) where
31 hash arr = runIdentity $ IUF.fold A.read IFL.rollingHash arr
32 hashWithSalt salt arr = runIdentity $
33 IUF.fold A.read (IFL.rollingHashWithSalt salt) arr
36toLower :: Char -> Char
38 | uc >= 0x61 && uc <= 0x7a = c
39 | otherwise = Char.toLower c
41 uc = fromIntegral (Char.ord c) :: Word
44isAlpha :: Char -> Bool
46 | uc >= 0x61 && uc <= 0x7a = True
47 | otherwise = Char.isAlpha c
49 uc = fromIntegral (Char.ord c) :: Word
54 alter Nothing = fmap Just $ newIORef (1 :: Int)
55 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
60 & 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
66 >>= mapM (\(w, ref) -> readIORef ref >>= \cnt -> return (w, cnt))
67 & fmap (List.take 25 . List.sortOn (Ord.Down . snd))
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