module Prune (prune) where import Data.ByteString.Char8 (ByteString) import Data.List (foldl', sortBy) import Data.Ord (comparing) import Data.Map (Map, toList, fromList) prune :: Map ByteString Double -> Map ByteString Int prune ts = let ccTotals = sortBy (flip $ comparing snd) (toList ts) sizes = map snd ccTotals total = sum' sizes limit = 0.99 * total bigs = takeWhile (< limit) . scanl (+) 0 $ sizes bands = zipWith const ccTotals $ take 15 bigs ccs = map fst bands in fromList (reverse ccs `zip` [1 ..]) sum' :: [Double] -> Double sum' = foldl' (+) 0