{-# LANGUAGE NoBangPatterns #-} -- ----------------------------------------------------------------------------- -- | Linearly usable maps and sets on identifiers ----------------------------------------------------------------------------- module Data.IdMap ( module Data.IdMap.Core , inserts , (!) , setInsert , setInserts ) where ------------------------------------ import Data.IdMap.Core import Data.List (foldl') ------------------------------------ infixl 8 ! -- better to be weaker than (~>) (!) :: I i => Map i k a -> Id k -> a m ! i = maybe (error "Data.IdMap.!") id (lookUp i m) inserts :: I i => Map i k a -> [(Id k, a)] -> Map i k a inserts = foldl' (\m (i,x) -> insert i x m) -- | /O(1)/. Insert a new key in the set. If the key is already in the set, the original set is returned. -- -- After insertion, the original set may not be used. setInsert :: I i => Id k -> Set i k -> Set i k setInsert k = insert k () setInserts :: I i => Set i k -> [Id k] -> Set i k setInserts = foldl' (flip setInsert)