    {-# OPTIONS -cpp #-}

    module Map (
       Map,
       empty, singleton,
       lookup, findWithDefault,
       insert,
       union, unionWith,
       map,
       fromList, toList
    ) where

    import Prelude hiding (lookup, map)

    #if __GLASGOW_HASKELL__ >= 603 || !__GLASGOW_HASKELL__
    import Data.Map
    #else
    import Data.FiniteMap

    type Map k a = FiniteMap k a

    empty :: Map k a
    empty = emptyFM

    singleton :: k -> a -> Map k a
    singleton = unitFM

    lookup :: Ord k => k -> Map k a -> Maybe a
    lookup = flip lookupFM

    findWithDefault :: Ord k => a -> k -> Map k a -> a
    findWithDefault a k m = lookupWithDefaultFM m a k

    insert :: Ord k => k -> a -> Map k a -> Map k a
    insert k a m = addToFM m k a

    insertWith :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
    insertWith c k a m = addToFM_C (flip c) m k a

    union :: Ord k => Map k a -> Map k a -> Map k a
    union = flip plusFM

    unionWith :: Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
    unionWith c l r = plusFM_C (flip c) r l

    map :: (a -> b) -> Map k a -> Map k b
    map f = mapFM (\_ -> f)

    fromList :: Ord k => [(k,a)] -> Map k a
    fromList = listToFM

    toList :: Map k a -> [(k, a)]
    toList = fmToList

    #endif