packages feed

hcount-0.0.1: app/hcount.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NegativeLiterals #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}

import qualified Data.Attoparsec.Text as A
import qualified Data.Char as Char
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
import HieTypes
import NumHask.Prelude
import Options.Applicative as OA
import Stan.Ghc.Compat
import Stan.Hie

main :: IO ()
main = do
  hccfg <- execParser (info (hc <**> helper) (fullDesc <> progDesc "Count haskell names using hie files"))
  report hccfg

-- | report to stdout
-- >>> report defaultHCountConfig
report :: HCountConfig -> IO ()
report cfg = do
  fs <- mapM readHieFiles (unpack <$> hcHiefiles cfg)
  putStrLn $ ("Number of repos: " :: Text) <> show (length fs)
  putStrLn $ ("Number of files: " :: Text) <> show (length $ mconcat fs)
  let ns = getNames fs
  putStrLn $ ("Total names: " :: Text) <> show (sum . fmap snd $ ns)
  putStrLn $ ("Unique names: " :: Text) <> show (length ns)

  when (hcAll cfg) $ do
    putStrLn ("top names" :: Text)
    putStrLn ("total names: " <> show (sum $ snd <$> ns) :: Text)
    putStrLn ("" :: Text)
    mapM_ putStrLn (fmap formatResults $ take (hcTopn cfg) $ first locname <$> ns)

  when (hcOperators cfg) $ do
    putStrLn ("top operators" :: Text)
    let op' = filter (oph (hcExcluded cfg) . fst) ns
    putStrLn ("total operators: " <> show (sum $ snd <$> op') :: Text)
    putStrLn ("" :: Text)
    mapM_ putStrLn (fmap formatResults $ take (hcTopn cfg) $ first locname <$> op')

  when (hcFunctions cfg) $ do
    putStrLn ("top lower case functions" :: Text)
    let lower' = filter (lowerh (hcExcluded cfg) . fst) ns
    putStrLn ("total functions: " <> show (sum $ snd <$> lower') :: Text)
    putStrLn ("" :: Text)
    mapM_ putStrLn (fmap formatResults $ take (hcTopn cfg) $ first locname <$> lower')

  when (hcConstructors cfg) $ do
    putStrLn ("top upper case constructors" :: Text)
    let upper' = filter (upperh (hcExcluded cfg) . fst) ns
    putStrLn ("total constructors: " <> show (sum $ snd <$> upper') :: Text)
    putStrLn ("" :: Text)
    mapM_ putStrLn (fmap formatResults $ take (hcTopn cfg) $ first locname <$> upper')

  when (hcLocals cfg) $ do
    putStrLn ("top local names" :: Text)
    let local' = filter (localh . fst) ns
    putStrLn ("total local names: " <> show (sum $ snd <$> local') :: Text)
    putStrLn ("" :: Text)
    mapM_ putStrLn (fmap formatResults $ take (hcTopn cfg) $ first locname <$> local')

getNames :: [[HieFile]] -> [((Loc, Text), Int)]
getNames = sortOn (Down . snd) . Map.toList . Main.count . names . fmap fst . mconcat . fmap astFlat . asts . mconcat

-- | Get the trees from each hie file, throwing away file details
asts :: [HieFile] -> [HieAST TypeIndex]
asts fs = mconcat $ Map.elems . getAsts . hie_asts <$> fs

-- | Throw away the tree structure and retain node information.
--
-- deconstruction of:
-- sum = P.foldr (+) zero
--
-- P.foldr
-- NodeInfo {nodeAnnotations = fromList [("HsVar","HsExpr"),("HsWrap","HsExpr")], nodeType = [7,24], nodeIdentifiers = fromList [(Right NameMeta {nameMetaPackage = "base", nameMetaModuleName = ModuleName {unModuleName = "Data.Foldable"}, nameMetaName = "foldr"},IdentifierDetails {identType = Just 24, identInfo = fromList [Use]})]}
--
-- (+)
--
-- NodeInfo {nodeAnnotations = fromList [("HsVar","HsExpr"),("HsWrap","HsExpr")], nodeType = [5,30], nodeIdentifiers = fromList [(Right NameMeta {nameMetaPackage = "numhask-0.7.0.1-7TAYiN9QGfDA9z2ZI270ii", nameMetaModuleName = ModuleName {unModuleName = "NumHask.Algebra.Additive"}, nameMetaName = "+"},IdentifierDetails {identType = Just 30, identInfo = fromList [Use]})]}
--
-- zero
--
-- NodeInfo {nodeAnnotations = fromList [("HsVar","HsExpr"),("HsWrap","HsExpr")], nodeType = [1,32], nodeIdentifiers = fromList [(Right NameMeta {nameMetaPackage = "numhask-0.7.0.1-7TAYiN9QGfDA9z2ZI270ii", nameMetaModuleName = ModuleName {unModuleName = "NumHask.Algebra.Additive"}, nameMetaName = "zero"},IdentifierDetails {identType = Just 32, identInfo = fromList [Use]})]}
--
-- LogField $ negate x
--
-- NodeInfo {nodeAnnotations = fromList [("HsConLikeOut","HsExpr"),("HsVar","HsExpr"),("HsWrap","HsExpr")], nodeType = [1246,1084], nodeIdentifiers = fromList [(Right NameMeta {nameMetaPackage = "numhask-0.7.0.1-7TAYiN9QGfDA9z2ZI270ii", nameMetaModuleName = ModuleName {unModuleName = "NumHask.Data.LogField"}, nameMetaName = "LogField"},IdentifierDetails {identType = Nothing, identInfo = fromList [Use]})]}
--
-- NodeInfo {nodeAnnotations = fromList [("HsVar","HsExpr"),("HsWrap","HsExpr")], nodeType = [1247,1256], nodeIdentifiers = fromList [(Right NameMeta {nameMetaPackage = "base", nameMetaModuleName = ModuleName {unModuleName = "GHC.Base"}, nameMetaName = "$"},IdentifierDetails {identType = Just 1256, identInfo = fromList [Use]})]}
--
-- NodeInfo {nodeAnnotations = fromList [("HsVar","HsExpr")], nodeType = [1220], nodeIdentifiers = fromList [(Right $_in$x,IdentifierDetails {identType = Just 1220, identInfo = fromList [Use]})]}
--
-- lf = fs !! 4
-- lf207s = filter (\x -> 207 == (srcLocLine . realSrcSpanStart . snd $ x)) $ (mconcat $ astFlat <$> asts [lf])
astFlat :: HieAST a -> [(NodeInfo a, Span)]
astFlat h = [(nodeInfo h, nodeSpan h)] <> mconcat (fmap astFlat (nodeChildren h))

data Loc = Local | Main | Base | Unknown | Package Text deriving (Show, Eq, Ord)

-- | extract simplified names of variables from the NodeInfo
names :: [NodeInfo a] -> [(Loc, Text)]
names nodes =
  [ simplifyLocName $ pack $ nameStableString x
    | (Right x) <-
        mconcat $
          Map.keys . nodeIdentifiers
            <$> filter (Set.member ("HsVar", "HsExpr") . nodeAnnotations) nodes
  ]

-- | count occurrences
count :: (Ord a) => [a] -> Map.Map a Int
count = Map.fromListWith (+) . fmap (,1)

-- | simplified location name
simplifyLocName :: Text -> (Loc, Text)
simplifyLocName t = either (const (Unknown, t)) id $ A.parseOnly lp t
  where
    lp = pLocal' <|> pLocal <|> pBase' <|> pBase <|> pPackage' <|> pPackage <|> pMain

pLocal :: A.Parser (Loc, Text)
pLocal = do
  _ <- A.string "$_in$"
  n <- A.takeText
  pure (Local, n)

pLocal' :: A.Parser (Loc, Text)
pLocal' = do
  _ <- A.string "$_in$"
  _ <- A.string "$d" <|> A.string "$cp1" <|> A.string "$cp2" <|> A.string "$cp3" <|> A.string "$cp4" <|> A.string "$c" <|> A.string "$C:"
  n <- A.takeText
  pure (Local, n)

pBase' :: A.Parser (Loc, Text)
pBase' = do
  _ <- A.string "$base$"
  _ <- A.skipWhile (/= '$')
  _ <- A.char '$'
  _ <- A.string "C:"
  n <- A.takeText
  pure (Base, n)

pBase :: A.Parser (Loc, Text)
pBase = do
  _ <- A.string "$base$"
  _ <- A.skipWhile (/= '$')
  _ <- A.char '$'
  n <- A.takeText
  pure (Base, n)

-- "numhask-space-0.7.0.0-LPYAlOQ382DJicX4NZ3Jtj"
--
pPackageName :: A.Parser Text
pPackageName = do
  ps <- A.sepBy1 (A.takeWhile (`notElem` ['-', '$'])) (A.char '-')
  case reverse ps of
    (_ : _ : ps') -> pure $ Text.intercalate "-" (reverse ps')
    ps' -> pure $ Text.intercalate "-" (reverse ps')

pPackage' :: A.Parser (Loc, Text)
pPackage' = do
  _ <- A.char '$'
  p <- pPackageName
  _ <- A.char '$'
  _ <- A.skipWhile (/= '$')
  _ <- A.char '$'
  _ <- A.string "C:"
  n <- A.takeText
  pure (Package p, n)

pPackage :: A.Parser (Loc, Text)
pPackage = do
  _ <- A.char '$'
  p <- pPackageName
  _ <- A.char '$'
  _ <- A.skipWhile (/= '$')
  _ <- A.char '$'
  n <- A.takeText
  pure (Package p, n)

pMain :: A.Parser (Loc, Text)
pMain = do
  _ <- A.string "$main$"
  _ <- A.skipWhile (/= '$')
  _ <- A.char '$'
  n <- A.takeText
  pure (Main, n)

lowerh :: [Text] -> (Loc, Text) -> Bool
lowerh _ (Local, _) = False
lowerh _ (Main, _) = False
lowerh _ (Base, n) = Char.isLower (Text.head n)
lowerh ex (Package p, n) = Char.isLower (Text.head n) && notElem p ex
lowerh _ (Unknown, _) = False

upperh :: [Text] -> (Loc, Text) -> Bool
upperh _ (Local, _) = False
upperh _ (Main, _) = False
upperh _ (Base, n) = Char.isUpper (Text.head n)
upperh ex (Package p, n) = Char.isUpper (Text.head n) && notElem p ex
upperh _ (Unknown, _) = False

oph :: [Text] -> (Loc, Text) -> Bool
oph _ (Local, _) = False
oph _ (Main, _) = False
oph _ (Base, n) = not $ Char.isLetter (Text.head n)
oph ex (Package p, n) = not (Char.isLetter (Text.head n)) && notElem p ex
oph _ (Unknown, _) = False

locname :: (Loc, Text) -> (Text, Text)
locname (Local, n) = ("local", n)
locname (Main, n) = ("main", n)
locname (Base, n) = ("base", n)
locname (Package p, n) = (p, n)
locname (Unknown, n) = ("unknown", n)

localh :: (Loc, Text) -> Bool
localh (Local, _) = True
localh (Main, _) = True
localh (Base, _) = False
localh (Package _, _) = False
localh (Unknown, _) = True

data HCountConfig = HCountConfig {hcHiefiles :: [Text], hcExcluded :: [Text], hcTopn :: Int, hcAll :: Bool, hcOperators :: Bool, hcFunctions :: Bool, hcConstructors :: Bool, hcLocals :: Bool} deriving (Show)

defaultHCountConfig :: HCountConfig
defaultHCountConfig = HCountConfig [".hie"] [] 10 True True True True True

hc :: Parser HCountConfig
hc =
  HCountConfig
    <$> fmap
      (\x -> bool x [".hie"] (null x))
      ( many $
          OA.option
            str
            ( metavar "DIR"
                <> long "hie-directory"
                <> short 'd'
                <> help "location of hie directory (default \".hie\")"
            )
      )
    <*> many
      ( OA.option
          str
          ( metavar "TEXT"
              <> long "excluded-lib"
              <> short 'e'
              <> help "Libraries to exclude from analysis"
          )
      )
    <*> OA.option
      auto
      ( long "topn"
          <> short 't'
          <> help "How many names to print"
          <> showDefault
          <> value 10
          <> metavar "INT"
      )
    <*> flag
      True
      False
      ( long "no-all-names"
          <> short 'a'
          <> help "no report on all names"
          <> showDefault
      )
    <*> flag
      True
      False
      ( long "no-operators"
          <> short 'o'
          <> help "no report on operators"
          <> showDefault
      )
    <*> flag
      True
      False
      ( long "no-functions"
          <> short 'f'
          <> help "no report on external functions used"
          <> showDefault
      )
    <*> flag
      True
      False
      ( long "no-constructors"
          <> short 'c'
          <> help "no report on constructors used"
          <> showDefault
      )
    <*> flag
      True
      False
      ( long "no-locals"
          <> short 'l'
          <> help "no report on local names"
          <> showDefault
      )

padl :: Int -> Text -> Text
padl n t = Text.replicate (n - Text.length t) " " <> t

padr :: Int -> Text -> Text
padr n t = t <> Text.replicate (n - Text.length t) " "

formatResults :: ((Text, Text), Int) -> Text
formatResults ((l, n), x) = padr 10 l <> padr 10 n <> padl 6 (show x)

-- | current personal run
--
-- > myhc = HCountConfig ((\fp -> "../" <> fp <> "/.hie") <$> [ "box","box-csv","box-socket","chart-svg","chart-svg-graphviz","ellipse","ephemeral","formatn","hcount","iqfeed","mealy","numhask","numhask-array","numhask-backprop","numhask-bench","numhask-space","perf","readme-lhs","web-rep"]) ["lucid", "web-rep", "backprop"] 100 True True True True True
-- > report myhc
-- Number of repos: 19
-- Number of files: 102
-- Total names: 31919
-- Unique names: 3103
-- top names
-- total names: 31919
--
-- base      $            828
-- local     x            696
-- base      fromLabel    613
-- base      .            536
-- local     a            510
-- numhask   *            510
-- base      &            499
-- lens      .~           483
-- base      <$>          479
-- base      <>           422
-- local     IsLabel      418
-- lens      ^.           411
-- local     s            400
-- numhask   +            378
-- local     c            299
-- local     n            284
-- local     y            263
-- numhask   -            254
-- numhask   /            252
-- local     showList     250
-- local     showsPrec    249
-- local     show         242
-- base      Show         241
-- local     /=           236
-- local     ==           234
--          Eq           234
-- local     f            220
-- base      Just         218
-- base      Generic      216
-- numhask-spacePoint        205
-- base      pure         200
-- local     r            182
-- local     xs           180
-- numhask   zero         176
-- base      mempty       173
-- local     b            172
--          ==           172
-- numhask   one          168
-- local     p            167
-- local     t            164
-- base      Nothing      161
--          []           155
-- local     d            151
-- protolude show         143
-- local     l            141
-- numhask   fromIntegral   140
-- chart-svg Chart        131
-- local     e            127
-- local     i            110
-- local     from         108
-- local     to           108
-- protolude bool         105
-- base      fmap          97
-- local     cs            96
-- base      maybe         90
-- local     o             87
-- local     g             86
-- local     m             84
-- local     w             83
-- local     Epsilon       80
-- local     x'            80
-- numhask-spacePointXY       78
-- local     go            76
--          :             76
-- base      id            75
-- base      <*>           74
-- lucid     with          74
-- base      snd           70
-- local     cfg           67
-- base      otherwise     67
-- local     v             66
-- local     z             66
-- lucid     term          66
-- base      fst           65
-- base      zipWith       65
-- chart-svg-graphvizDependency    64
-- web-rep   class__       64
-- local     step          61
-- local     ts            60
--          pack          57
-- base      !!            54
-- numhask   negate        54
-- local     -             53
-- local     Norm          51
-- local     a'            51
-- local     Distributive    50
--          True          50
-- lens      %~            50
-- local     h             48
-- local     y'            48
-- base      mconcat       47
-- local     Signed        46
-- base      reverse       45
-- local     fromIntegral    44
--          False         44
-- box       commit        44
-- chart-svg LineA         44
-- numhask   FromIntegral    44
-- lucid     toHtml        43
-- numhask   pi            43
-- top operators
-- total operators: 6330
--
-- base      $            828
-- base      .            536
-- numhask   *            510
-- base      &            499
-- lens      .~           483
-- base      <$>          479
-- base      <>           422
-- lens      ^.           411
-- numhask   +            378
-- numhask   -            254
-- numhask   /            252
--          ==           172
--          []           155
--          :             76
-- base      <*>           74
-- base      !!            54
-- lens      %~            50
--          &&            42
--          ()            39
--          <             31
-- bifunctors<<*>>         29
-- base      <|>           28
--          >             28
-- numhask   .*            24
-- base      +             22
--          <=            21
-- numhask   ^             21
--          >=            20
-- numhask   :%            20
-- lens      ?~            19
--          ||            18
-- numhask   :+            17
-- base      *             16
-- base      ++            16
--          (,)           15
-- lens      _1            15
-- numhask   **            15
-- base      *>            14
-- base      -             14
-- box       <$.>          13
--          /=            12
-- numhask   /.            11
-- base      :|             9
-- numhask   /\             9
-- numhask   \/             9
-- numhask-space_x             9
-- numhask-space_y             9
-- base      >>             8
-- lens      _Just          8
-- numhask-space...            8
-- numhask   ^^             7
-- base      <*             6
-- lens      .=             6
-- numhask-space>.<            6
-- base      <$             5
-- chart-svg $sel:rstyle:AxisBar     5
-- microlens .~             5
-- numhask-space|.|            5
-- microlens ^.             4
-- numhask-space|.             4
--          !              3
-- chart-svg $sel:positions:TickComponents     3
-- chart-svg $sel:xys:Chart     3
-- lens      _2             3
-- base      $!             2
-- base      **             2
-- base      /              2
--          |>             2
-- chart-svg $sel:color':Colour'     2
-- chart-svg $sel:unhud:Hud     2
-- clay      ?              2
-- lens      %=             2
-- numhask   ⊕              2
-- vector    !              2
-- base      $>             1
-- base      %              1
-- base      =<<            1
-- base      >=>            1
-- base      >>=            1
--          (,,)           1
--          <|             1
-- box       <*.>           1
-- chart-svg $sel:annotation:Chart     1
-- chart-svg $sel:labels:TickComponents     1
-- hmatrix   <>             1
-- hmatrix   ><             1
-- numhask   $c:+           1
-- numhask   $cLogField     1
-- numhask   $tComplex      1
-- numhask   $tLogField     1
-- numhask   *.             1
-- numhask-space+/-            1
-- numhask-space<.>            1
-- numhask-space|<|            1
-- numhask-space|>|            1
-- semigroupoids<.>            1
-- unordered-containers!              1
-- top lower case functions
-- total functions: 7250
--
-- base      fromLabel    613
-- base      pure         200
-- numhask   zero         176
-- base      mempty       173
-- numhask   one          168
-- protolude show         143
-- numhask   fromIntegral   140
-- protolude bool         105
-- base      fmap          97
-- base      maybe         90
-- base      id            75
-- base      snd           70
-- base      otherwise     67
-- base      fst           65
-- base      zipWith       65
--          pack          57
-- numhask   negate        54
-- base      mconcat       47
-- base      reverse       45
-- box       commit        44
-- numhask   pi            43
-- chart-svg defaultLineStyle    39
-- chart-svg palette1      36
-- numhask   sin           36
-- numhask   cos           33
-- base      const         32
--          unpack        32
-- box       emit          32
-- chart-svg writeChartSvg    31
-- base      liftIO        30
-- numhask-spacelower         30
-- base      fromIntegral    29
-- base      length        29
-- base      second        29
-- base      fromMaybe     28
-- base      take          28
-- base      abs           27
-- base      zip           27
-- chart-svg defaultHudOptions    27
-- chart-svg ellipse       27
--          max           26
--          min           26
-- chart-svg defaultTextStyle    26
-- numhask   floor         26
-- numhask-spaceupper         26
-- base      return        25
-- base      fromInteger    24
-- box       glue          24
-- chart-svg fromV2        24
-- numhask-arrayshape         24
-- attoparsectakeText      23
-- chart-svg defaultGlyphStyle    23
-- foldl     fold          23
--          lift          22
-- chart-svg fromRGB       22
--          addDays       21
-- base      bimap         20
-- chart-svg defaultRectStyle    20
-- attoparsecchar          19
-- numhask   exp           19
-- numhask   sum           19
-- base      drop          18
-- base      fromString    18
-- base      show          18
-- adjunctionsindex         18
-- numhask   abs           18
-- base      foldl'        17
-- adjunctionstabulate      17
-- lens      use           17
-- numhask   sqrt          17
-- numhask   two           17
-- numhask-arrayindex         17
-- base      either        16
-- box       mapE          16
-- box       toStdout      16
-- box-csv   int'          16
-- base      flip          15
-- base      natVal        15
-- base      throw         15
-- attoparsecstring        15
-- chart-svg defaultSvgOptions    15
-- mmorph    hoist         15
-- numhask   fromBaseRational    15
-- numhask-arraytabulate      15
-- numhask-spacefoldRect      15
-- profunctorslmap          15
-- base      negate        14
-- base      signum        14
-- base      toRational    14
-- chart-svg defaultTitle    14
-- chart-svg opac          14
-- numhask-spaceaspect        14
-- numhask-spacefromNominalDiffTime    14
-- numhask-spacespace1        14
-- numhask-spacetoNominalDiffTime    14
-- numhask-spacetoPoint       14
-- numhask-spacetoRect        14
--          addUTCTime    13
-- box-csv   double'       13
-- chart-svg setOpac       13
-- top upper case constructors
-- total constructors: 4109
--
-- base      Show         241
--          Eq           234
-- base      Just         218
-- base      Generic      216
-- numhask-spacePoint        205
-- base      Nothing      161
-- chart-svg Chart        131
-- numhask-spacePointXY       78
-- chart-svg-graphvizDependency    64
--          True          50
--          False         44
-- chart-svg LineA         44
-- numhask   FromIntegral    44
-- numhask-spaceRect          42
-- chart-svg Colour        40
-- numhask   ToIntegral    37
-- chart-svg RectA         35
-- numhask-spaceRange         34
-- base      Functor       31
-- box       Box           30
-- numhask   Additive      29
-- numhask   Multiplicative    29
-- base      Left          28
-- chart-svg TextA         28
-- numhask   Subtractive    28
-- numhask   JoinSemiLattice    27
-- numhask   MeetSemiLattice    27
-- numhask-spaceRectXY        27
-- box       Emitter       26
-- base      Right         25
-- chart-svg GlyphA        25
-- numhask   Distributive    25
-- numhask   Signed        25
-- numhask-spaceP             25
--          Ord           23
-- foldl     Fold          22
-- numhask   Epsilon       22
-- base      Semigroup     21
-- box       Committer     21
-- box       Cont          21
-- base      Proxy         20
-- reanimate-svgNum           20
-- language-javascriptJSSemi        19
-- numhask   BoundedJoinSemiLattice    19
-- numhask   InvolutiveRing    19
-- numhask   ToRatio       19
-- readme-lhsBlock         19
-- chart-svg PlaceBottom    18
-- language-javascriptJSAstProgram    18
-- language-javascriptJSExpressionStatement    18
-- numhask   BoundedMeetSemiLattice    18
-- numhask   Integral      18
-- base      Foldable      17
-- base      Traversable    17
-- numhask   Norm          17
-- base      Last          16
-- base      Monoid        16
-- mealy     M             16
-- numhask   LogField      16
-- numhask-spaceR             16
--          UTCTime       15
-- base      Applicative    14
-- base      Read          14
-- chart-svg LineI         14
-- numhask   Divisive      14
-- numhask   FromInteger    14
-- numhask   NumHaskException    14
-- numhask-arrayArray         14
-- chart-svg AnchorStart    13
-- chart-svg Hud           12
-- chart-svg LineCapRound    12
-- chart-svg-graphvizRing          12
-- language-javascriptJSNoAnnot     12
-- numhask   Field         12
-- readme-lhsCode          12
-- chart-svg FixedAspect    11
-- chart-svg PathA         11
-- chart-svg PlaceLeft     11
-- chart-svg PlaceRight    11
-- chart-svg-graphvizField         11
-- chart-svg-graphvizNumHaskCluster    11
-- chart-svg AnchorEnd     10
-- chart-svg PlaceTop      10
-- numhask   ExpField      10
-- numhask   UpperBoundedField    10
-- numhask-spaceMidPos        10
-- chart-svg ArcInfo        9
-- chart-svg ArcPosition     9
-- chart-svg-graphvizAdditive       9
-- chart-svg-graphvizAssociative     9
-- chart-svg-graphvizGroupCluster     9
-- chart-svg-graphvizMultiplicative     9
-- chart-svg-graphvizUnital         9
-- numhask   LowerBoundedField     9
-- numhask   QuotientField     9
-- numhask-spaceOuterPos       9
-- chart-svg BlankA         8
-- chart-svg ChartSvg       8
-- chart-svg RectStyle      8
-- chart-svg StartI         8
-- top local names
-- total local names: 13262
--
-- local     x            696
-- local     a            510
-- local     IsLabel      418
-- local     s            400
-- local     c            299
-- local     n            284
-- local     y            263
-- local     showList     250
-- local     showsPrec    249
-- local     show         242
-- local     /=           236
-- local     ==           234
-- local     f            220
-- local     r            182
-- local     xs           180
-- local     b            172
-- local     p            167
-- local     t            164
-- local     d            151
-- local     l            141
-- local     e            127
-- local     i            110
-- local     from         108
-- local     to           108
-- local     cs            96
-- local     o             87
-- local     g             86
-- local     m             84
-- local     w             83
-- local     Epsilon       80
-- local     x'            80
-- local     go            76
-- local     cfg           67
-- local     v             66
-- local     z             66
-- local     step          61
-- local     ts            60
-- local     -             53
-- local     Norm          51
-- local     a'            51
-- local     Distributive    50
-- local     h             48
-- local     y'            48
-- local     Signed        46
-- local     fromIntegral    44
-- local     sconcat       42
-- local     stimes        42
-- local     rx            41
-- local     pl            40
-- local     aboutEqual    39
-- local     phi           39
-- local     <$            38
-- local     nearZero      37
-- local     ps            37
-- local     toIntegral    37
-- local     zero          37
-- local     c'            36
-- local     adj           34
-- local     ds            34
-- local     epsilon       34
-- local     one           33
-- local     u             33
-- local     mconcat       32
-- local     div           31
-- local     fmap          31
-- local     mod           31
-- local     quot          31
-- local     rem           31
-- local     start         31
-- local     Field         30
-- local     ry            30
-- local     so            30
-- local     *             29
-- local     +             29
-- local     x2            29
-- local     xs'           29
-- local     negate        28
-- local     p1            28
-- local     /\            27
-- local     QuotientField    27
-- local     Subtractive    27
-- local     \/            27
-- local     q             27
-- local     ann           26
-- local     fa            26
-- local     JoinSemiLattice    25
-- local     MeetSemiLattice    25
-- local     abs           25
-- local     conn          25
-- local     end           25
-- local     sign          25
-- local     /             24
-- local     >             24
-- local     >=            24
-- local     compare       24
-- local     f'            24
-- local     max           24
-- local     min           24
-- local     pc            24
-- local     <             23