module Data.List.IdMap
    where

import Data.IdMap

import qualified Data.List as List
import Data.Maybe

-----------------------------------------------------------------------------------

nubId :: I m => Set m a -> [Id a] -> (Set m a, [Id a])
nubId s [] = (s, [])
nubId s (h:t)
    | h `member` s   = nubId s t
    | otherwise         = h `add` nubId (setInsert h s) t
 where
    add :: a -> (b, [a]) -> (b, [a])
    x `add` ~(s, xs) = (s, x:xs)


fromList' :: I m => Map m a [b] -> [(Id a, b)] -> Map m a [b]
fromList' = List.foldl' f where

    f m (a,b) = case lookUp a m of
        Nothing -> insert a [b] m
        Just bs -> insert a (b:bs) m