    module Haskore.General.Map
           (Map, (!), (\\), null, size, member, lookup, findWithDefault,
            empty, singleton,
            insert, insertWith, insertWithKey, insertLookupWithKey,
            delete, adjust, adjustWithKey,
            update, updateWithKey, updateLookupWithKey,
            union, unionWith, unionWithKey, unions, unionsWith,
            difference, differenceWith, differenceWithKey,
            intersection, intersectionWith, intersectionWithKey,
            map, mapWithKey, mapAccum, mapAccumWithKey,
            mapKeys, mapKeysWith, mapKeysMonotonic,
            fold, foldWithKey, elems, keys, keysSet,
            assocs, toList, fromList, fromListWith, fromListWithKey,
            toAscList, fromAscList, fromAscListWith, fromAscListWithKey,
            fromDistinctAscList, filter, filterWithKey,
            partition, partitionWithKey, split, splitLookup,
            isSubmapOf, isSubmapOfBy, isProperSubmapOf, isProperSubmapOfBy,
            lookupIndex, findIndex, elemAt, updateAt, deleteAt,
            findMin, findMax, deleteMin, deleteMax, deleteFindMin, deleteFindMax,
            updateMin, updateMax, updateMinWithKey, updateMaxWithKey,
            showTree, showTreeWith, valid)
           where

    import qualified Data.Map as Map
    import Data.Map
       (Map, (!), (\\), null, size, member, empty, singleton,
        insert, insertWith, insertWithKey, insertLookupWithKey,
        delete, adjust, adjustWithKey,
        update, updateWithKey, updateLookupWithKey,
        union, unionWith, unionWithKey, unions, unionsWith,
        difference, differenceWith, differenceWithKey,
        intersection, intersectionWith, intersectionWithKey,
        map, mapWithKey, mapAccum, mapAccumWithKey,
        mapKeys, mapKeysWith, mapKeysMonotonic,
        fold, foldWithKey, elems, keys, keysSet,
        assocs, toList, fromList, fromListWith, fromListWithKey,
        toAscList, fromAscList, fromAscListWith, fromAscListWithKey,
        fromDistinctAscList, filter, filterWithKey,
        partition, partitionWithKey, split, splitLookup,
        isSubmapOf, isSubmapOfBy, isProperSubmapOf, isProperSubmapOfBy,
        elemAt, updateAt, deleteAt,
        findMin, findMax, deleteMin, deleteMax, deleteFindMin, deleteFindMax,
        updateMin, updateMax, updateMinWithKey, updateMaxWithKey,
        showTree, showTreeWith, valid)

    import Prelude hiding (lookup, map, filter, null)

    {-
      The signatures of the lookup functions in Data.Map
      are very unfortunate.
      We replace them by more usable ones here.
    -}

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

    findWithDefault :: Ord k => Map k a -> a -> k -> a
    findWithDefault dict deflt key =
       Map.findWithDefault deflt key dict

    lookupIndex :: Ord k => Map k a -> k -> Maybe Int
    lookupIndex = flip Map.lookupIndex

    findIndex :: Ord k => Map k a -> k -> Int
    findIndex = flip Map.findIndex