-- | Extra functions for "Data.Vector"
module Data.Vector.Generic.Extra
  ( frequencies
  ) where

import qualified Data.Map.Strict     as M ( Map, empty, insertWith )
import           Data.Vector.Generic      ( Vector, foldl' )

-- $setup
-- >>> :module + Data.Vector

-- | @frequencies xs@ returns a 'Map' from distinct items in @xs@ to the
--   number of times they appear.
--
-- >>> frequencies $ fromList "bra bra bar"
-- fromList [(' ',2),('a',3),('b',3),('r',3)]
frequencies :: (Ord a, Vector v a, Num n) => v a -> M.Map a n
frequencies = foldl' (\m k -> M.insertWith (+) k 1 m) M.empty