{-# LANGUAGE NoImplicitPrelude, PolymorphicComponents #-}

-- | This module provides a first-class version
-- of the "Data.Map" module.
module ModularPrelude.Module.Map
  ( -- * Module interface
    MapModule (..)
    -- * Module contents
  , MapImplements (..)
  ) where


import ModularPrelude hiding (empty)
import qualified Data.Map as Map


data MapModule = Map
  { MapModule -> forall k a b. (a -> b) -> Map k a -> Map k b
map       :: forall k a b. (a -> b) -> Map k a -> Map k b
  , MapModule
-> forall k a. Ord k => (k -> a -> Bool) -> Map k a -> Map k a
filter    :: forall k a. Ord k => (k -> a -> Bool) -> Map k a -> Map k a
  , MapModule -> forall k a. Map k a -> Int
length    :: forall k a. Map k a -> Int
  , MapModule -> forall k a. k -> a -> Map k a
singleton :: forall k a. k -> a -> Map k a
  , MapModule -> forall k a. Map k a -> Bool
null      :: forall k a. Map k a -> Bool
  , MapModule -> forall k a. Ord k => [(k, a)] -> Map k a
pack      :: forall k a. Ord k => [(k, a)] -> Map k a
  , MapModule -> forall k a. Map k a -> [(k, a)]
unpack    :: forall k a. Map k a -> [(k, a)]
  , MapModule -> forall k a. Ord k => [(k, a)] -> Map k a
fromList  :: forall k a. Ord k => [(k, a)] -> Map k a
  , MapModule -> forall k a. Map k a -> [(k, a)]
toList    :: forall k a. Map k a -> [(k, a)]
  , MapModule -> forall k a. Ord k => k -> Map k a -> Maybe a
lookup    :: forall k a. Ord k => k -> Map k a -> Maybe a
  , MapModule -> forall k a. Map k a
empty     :: forall k a. Map k a
  , MapModule -> forall k a. Ord k => k -> a -> Map k a -> Map k a
insert    :: forall k a. Ord k => k -> a -> Map k a -> Map k a
  , MapModule -> forall k a. Ord k => k -> Map k a -> Map k a
delete    :: forall k a. Ord k => k -> Map k a -> Map k a
  , MapModule -> forall k a. Ord k => k -> Map k a -> Bool
member    :: forall k a. Ord k => k -> Map k a -> Bool
  }


class MapImplements interface where
  _Data_Map_ :: interface

instance MapImplements MapModule where
  _Data_Map_ :: MapModule
_Data_Map_ = Map
    { map :: forall k a b. (a -> b) -> Map k a -> Map k b
map       = (a -> b) -> Map k a -> Map k b
forall a b k. (a -> b) -> Map k a -> Map k b
forall k a b. (a -> b) -> Map k a -> Map k b
Map.map
    , filter :: forall k a. Ord k => (k -> a -> Bool) -> Map k a -> Map k a
filter    = (k -> a -> Bool) -> Map k a -> Map k a
forall k a. Ord k => (k -> a -> Bool) -> Map k a -> Map k a
forall k a. (k -> a -> Bool) -> Map k a -> Map k a
Map.filterWithKey
    , length :: forall k a. Map k a -> Int
length    = Map k a -> Int
forall k a. Map k a -> Int
Map.size
    , singleton :: forall k a. k -> a -> Map k a
singleton = k -> a -> Map k a
forall k a. k -> a -> Map k a
Map.singleton
    , null :: forall k a. Map k a -> Bool
null      = Map k a -> Bool
forall k a. Map k a -> Bool
Map.null
    , pack :: forall k a. Ord k => [(k, a)] -> Map k a
pack      = [(k, a)] -> Map k a
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
    , unpack :: forall k a. Map k a -> [(k, a)]
unpack    = Map k a -> [(k, a)]
forall k a. Map k a -> [(k, a)]
Map.toList
    , fromList :: forall k a. Ord k => [(k, a)] -> Map k a
fromList  = [(k, a)] -> Map k a
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
    , toList :: forall k a. Map k a -> [(k, a)]
toList    = Map k a -> [(k, a)]
forall k a. Map k a -> [(k, a)]
Map.toList
    , lookup :: forall k a. Ord k => k -> Map k a -> Maybe a
lookup    = k -> Map k a -> Maybe a
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup
    , empty :: forall k a. Map k a
empty     = Map k a
forall k a. Map k a
Map.empty
    , insert :: forall k a. Ord k => k -> a -> Map k a -> Map k a
insert    = k -> a -> Map k a -> Map k a
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert
    , delete :: forall k a. Ord k => k -> Map k a -> Map k a
delete    = k -> Map k a -> Map k a
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete
    , member :: forall k a. Ord k => k -> Map k a -> Bool
member    = k -> Map k a -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member
    }


instance Default MapModule where
  def :: MapModule
def = MapModule
forall interface. MapImplements interface => interface
_Data_Map_