{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Trustworthy #-}
module Data.EnumMap.STRICT where
import Prelude (Eq, Ord, Enum, Functor (..), (.), ($), (>))
import Control.DeepSeq
import Data.Data
import Data.Foldable (Foldable)
import Data.IntMap.STRICT
import Data.Monoid
import Data.Traversable
import Text.ParserCombinators.ReadPrec
import Text.Read
import Text.Show
import Data.EnumMapSetWrapper
import Data.EnumSet (EnumSet (..))
infixr 1 `EnumMap`
newtype EnumMap k v = EnumMap { unEnumMap :: IntMap v } deriving
(Eq, Ord, Monoid, Typeable, Data, NFData)
------------------------------------------------------------------------
-- * Operators
w '(!)
w '(\\)
-- * Query
w 'null
w 'size
w 'member
w 'notMember
w 'lookup
w 'findWithDefault
w 'lookupLT
w 'lookupGT
w 'lookupLE
w 'lookupGE
-- * Construction
w 'empty
w 'singleton
-- * Insertion
w 'insert
w 'insertWith
w 'insertWithKey
w 'insertLookupWithKey
-- * Delete/Update
w 'delete
w 'adjust
w 'adjustWithKey
w 'update
w 'updateWithKey
w 'updateLookupWithKey
w 'alter
-- * Combine: Union
w 'union
w 'unionWith
w 'unionWithKey
w 'unions
w 'unionsWith
-- * Combine: Difference
w 'difference
w 'differenceWith
w 'differenceWithKey
-- * Combine: Intersection
w 'intersection
w 'intersectionWith
w 'intersectionWithKey
-- * Combine: Universal combining function
w 'mergeWithKey
-- * Traversal: Map
w 'map
w 'mapWithKey
w 'traverseWithKey
w 'mapAccum
w 'mapAccumWithKey
w 'mapAccumRWithKey
w' 'mapKeys
w' 'mapKeysWith
w' 'mapKeysMonotonic
-- * Traversal: Folds
w 'foldr
w 'foldl
w 'foldrWithKey
w 'foldlWithKey
w 'foldMapWithKey
-- * Traversal: Strict folds
w 'foldr'
w 'foldl'
w 'foldrWithKey'
w 'foldlWithKey'
-- * Conversion
w 'elems
w 'keys
w 'assocs
w 'keysSet
w 'fromSet
-- * Conversion: Lists
w 'toList
w 'fromList
w 'fromListWith
w 'fromListWithKey
-- * Conversion: Ordered lists
w 'toAscList
w 'toDescList
w 'fromAscList
w 'fromAscListWith
w 'fromAscListWithKey
w 'fromDistinctAscList
-- * Filter
w 'filter
w 'filterWithKey
w 'partition
w 'partitionWithKey
w 'mapMaybe
w 'mapMaybeWithKey
w 'mapEither
w 'mapEitherWithKey
w 'split
w 'splitLookup
-- * Submap
w 'isSubmapOf
w 'isSubmapOfBy
w 'isProperSubmapOf
w 'isProperSubmapOfBy
-- * Min/Max
w 'findMin
w 'findMax
w 'deleteMin
w 'deleteMax
w 'deleteFindMin
w 'deleteFindMax
w 'updateMin
w 'updateMax
w 'updateMinWithKey
w 'updateMaxWithKey
w 'minView
w 'maxView
w 'minViewWithKey
w 'maxViewWithKey
-- * Debugging
w 'showTree
w 'showTreeWith
------------------------------------------------------------------------
instance Functor (EnumMap k) where
{-# INLINE fmap #-}
fmap = Data.EnumMap.STRICT.map
deriving instance Foldable (EnumMap k)
deriving instance Traversable (EnumMap k)
instance (Enum k, Show k, Show a) => Show (EnumMap k a) where
showsPrec p m = showParen (p > 10) $
showString "fromList " . shows (Data.EnumMap.STRICT.toList m)
instance (Enum k, Read k, Read a) => Read (EnumMap k a) where
readPrec = parens . prec 10 $ do
Ident "fromList" <- lexP
Data.EnumMap.STRICT.fromList `fmap` readPrec
-- vim: ft=haskell: