{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module NLP.Concraft.Morphosyntax.WMap
( WMap (unWMap)
, fromMap
, mapWMap
, mkWMap
, trim
) where
import Control.Arrow (first)
import Data.Binary (Binary)
import Data.Ord (comparing)
import Data.List (sortBy)
import qualified Data.Map as M
newtype WMap a = WMap { unWMap :: M.Map a Double }
deriving (Show, Eq, Ord, Binary)
fromMap :: M.Map a Double -> WMap a
fromMap = WMap
mkWMap :: Ord a => [(a, Double)] -> WMap a
mkWMap = WMap . M.fromListWith (+) . filter ((>=0).snd)
mapWMap :: Ord b => (a -> b) -> WMap a -> WMap b
mapWMap f = mkWMap . map (first f) . M.toList . unWMap
trim :: (Ord a) => Int -> WMap a -> WMap a
trim k
= mkWMap
. take k
. reverse
. sortBy (comparing snd)
. M.toList
. unWMap