{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Data.Strict.Map.Lens ( toMapOf ) where import Control.Lens import qualified Data.Strict.Map as M import Data.Strict.Map (Map) #if !MIN_VERSION_lens(5,0,0) instance FunctorWithIndex k (Map k) where imap = M.mapWithKey {-# INLINE imap #-} instance FoldableWithIndex k (Map k) where ifoldMap = M.foldMapWithKey {-# INLINE ifoldMap #-} ifoldr = M.foldrWithKey {-# INLINE ifoldr #-} ifoldl' = M.foldlWithKey' . flip {-# INLINE ifoldl' #-} instance TraversableWithIndex k (Map k) where itraverse = M.traverseWithKey {-# INLINE itraverse #-} #endif type instance Index (Map k v) = k type instance IxValue (Map k v) = v instance Ord k => Ixed (Map k a) where ix k f m = case M.lookup k m of Just v -> f v <&> \v' -> M.insert k v' m Nothing -> pure m {-# INLINE ix #-} instance Ord k => At (Map k v) where at k f = M.alterF f k {-# INLINE at #-} instance AsEmpty (Map k a) where _Empty = nearly M.empty M.null {-# INLINE _Empty #-} instance (c ~ d) => Each (Map c a) (Map d b) a b where each = traversed {-# INLINE each #-} instance (t ~ Map k' a', Ord k) => Rewrapped (Map k a) t instance Ord k => Wrapped (Map k a) where type Unwrapped (Map k a) = [(k, a)] _Wrapped' = iso M.toAscList M.fromList {-# INLINE _Wrapped' #-} instance Ord k => TraverseMin k (Map k) where traverseMin f m = case M.minViewWithKey m of Just ((k, a), _) -> indexed f k a <&> \v -> M.updateMin (const (Just v)) m Nothing -> pure m {-# INLINE traverseMin #-} instance Ord k => TraverseMax k (Map k) where traverseMax f m = case M.maxViewWithKey m of Just ((k, a), _) -> indexed f k a <&> \v -> M.updateMax (const (Just v)) m Nothing -> pure m {-# INLINE traverseMax #-} -- | Analogous to 'Data.Map.Lens.toMapOf'. toMapOf :: IndexedGetting i (Map i a) s a -> s -> Map i a toMapOf l = iviews l M.singleton