{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Data.Strict.HashMap.Lens ( ) where import Control.Lens import Data.Hashable (Hashable) import qualified Data.Strict.HashMap as HM import Data.Strict.HashMap (HashMap) #if !MIN_VERSION_lens(5,0,0) instance FunctorWithIndex k (HashMap k) where imap = HM.mapWithKey {-# INLINE imap #-} instance FoldableWithIndex k (HashMap k) where ifoldr = HM.foldrWithKey {-# INLINE ifoldr #-} ifoldl' = HM.foldlWithKey' . flip {-# INLINE ifoldl' #-} instance TraversableWithIndex k (HashMap k) where itraverse = HM.traverseWithKey {-# INLINE itraverse #-} #endif type instance Index (HashMap k v) = k type instance IxValue (HashMap k v) = v instance (Eq k, Hashable k) => Ixed (HashMap k a) where ix k f m = case HM.lookup k m of Just v -> f v <&> \v' -> HM.insert k v' m Nothing -> pure m {-# INLINE ix #-} instance (Eq k, Hashable k) => At (HashMap k v) where at k f = HM.alterF f k {-# INLINE at #-} instance AsEmpty (HashMap k a) where _Empty = nearly HM.empty HM.null {-# INLINE _Empty #-} instance (c ~ d) => Each (HashMap c a) (HashMap d b) a b where each = traversed {-# INLINE each #-} instance (t ~ HashMap k' a', Hashable k, Eq k) => Rewrapped (HashMap k a) t instance (Hashable k, Eq k) => Wrapped (HashMap k a) where type Unwrapped (HashMap k a) = [(k, a)] _Wrapped' = iso HM.toList HM.fromList {-# INLINE _Wrapped' #-}