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.String as Streamly
20import qualified Streamly.FileSystem.Handle as FH
21import qualified Streamly.Data.Fold as FL
22import qualified Streamly.Internal.Data.Fold as Internal
23import qualified Streamly.Memory.Array as A
24import qualified Streamly.Prelude as Streamly
25import System.Environment (getArgs)
26import System.IO (openFile, IOMode(..))
28instance (Enum a, Storable a) => Hashable (A.Array a) where
29 hash arr = runIdentity $ Streamly.runFold Internal.rollingHash (A.read arr)
30 hashWithSalt salt arr = runIdentity $
31 Streamly.runFold (Internal.rollingHashWithSalt salt) (A.read arr)
34toLower :: Char -> Char
36 | uc >= 0x61 && uc <= 0x7a = c
37 | otherwise = Char.toLower c
39 uc = fromIntegral (Char.ord c) :: Word
42isAlpha :: Char -> Bool
44 | uc >= 0x61 && uc <= 0x7a = True
45 | otherwise = Char.isAlpha c
47 uc = fromIntegral (Char.ord c) :: Word
52 alter Nothing = fmap Just $ newIORef (1 :: Int)
53 alter (Just ref) = modifyIORef' ref (+ 1) >> return (Just ref)
55 name <- fmap head getArgs
56 src <- openFile name ReadMode
57 FH.read src -- SerialT IO Word8
58 & Streamly.decodeChar8 -- SerialT IO Char
59 & Streamly.map toLower -- SerialT IO Char
60 & Streamly.foldWords FL.toList -- SerialT IO String
61 & Streamly.filter (all isAlpha)
62 & Streamly.foldlM' (flip (Map.alterF alter)) Map.empty
64 >>= mapM (\(w, ref) -> readIORef ref >>= \cnt -> return (w, cnt))
65 & 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