packages feed

country-0.2.2: bench/Size.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeApplications #-}

import Country (hashMapUtf8,hashMapUtf16)
import Data.Compact
import Data.Foldable

import qualified Data.List as List
import qualified Country
import qualified Data.Bytes.HashMap.Word as Map

main :: IO ()
main = do
  szUtf8 <- estimateHeapUse hashMapUtf8
  putStrLn ("UTF-8 HashMap Size:  " ++ show szUtf8)
  szUtf16 <- estimateHeapUse hashMapUtf16
  putStrLn ("UTF-16 HashMap Size: " ++ show szUtf16)
  putStrLn "UTF-8 HashMap Distribution:"
  forM_ (Map.distribution hashMapUtf8) $ \(bktSz,ct) ->
    putStrLn (show bktSz ++ "," ++ show ct)
  putStrLn ("UTF-8 HashMap Distinct Entropies: " ++ show (Map.distinctEntropies hashMapUtf8))

-- I think this rounds to the nearest 4KB.
estimateHeapUse :: a -> IO Word
estimateHeapUse a = foldlM
  ( \lo i -> do
    w <- compactSized (i * 2000) True a >>= compactSize
    pure (min lo w)
  ) maxBound [1..50]