21 lines
786 B
Haskell
21 lines
786 B
Haskell
import Language.Haskell.Parser (parseModule)
|
|
import Data.List.Split (splitOn)
|
|
import Data.List (nub, sortOn, elemIndices)
|
|
|
|
findApps src = freq $ concat [apps, comps]
|
|
where
|
|
ast = show $ parseModule src
|
|
apps = extract <$> splitApp ast
|
|
comps = extract <$> concat (splitComp <$> splitInfix ast)
|
|
splitApp = tail . splitOn "(HsApp (HsVar (UnQual (HsIdent \""
|
|
splitInfix = tail . splitOn "(HsInfixApp (HsVar (UnQual (HsIdent \""
|
|
splitComp = take 1 . splitOn "(HsQVarOp (UnQual (HsSymbol \""
|
|
extract = takeWhile (/= '\"')
|
|
freq lst = [ (count x lst, x) | x <- nub lst ]
|
|
count x = length . elemIndices x
|
|
|
|
main = do
|
|
src <- readFile "CountFunctions.hs"
|
|
let res = sortOn (negate . fst) $ findApps src
|
|
mapM_ (\(n, f) -> putStrLn $ show n ++ "\t" ++ f) res
|