module Data.IntMap.Lens
( traverseAtMin
, traverseAtMax
) where
import Control.Applicative as Applicative
import Control.Lens
import Data.IntMap as IntMap
traverseAtMin :: SimpleIndexedTraversal Int (IntMap v) v
traverseAtMin = index $ \f m -> case IntMap.minViewWithKey m of
#if MIN_VERSION_containers(0,5,0)
Just ((k,a), _) -> (\v -> IntMap.updateMin (const (Just v)) m) <$> f k a
#else
Just ((k,a), _) -> (\v -> IntMap.updateMin (const v) m) <$> f k a
#endif
Nothing -> pure m
traverseAtMax :: SimpleIndexedTraversal Int (IntMap v) v
traverseAtMax = index $ \f m -> case IntMap.maxViewWithKey m of
#if MIN_VERSION_containers(0,5,0)
Just ((k,a), _) -> (\v -> IntMap.updateMax (const (Just v)) m) <$> f k a
#else
Just ((k,a), _) -> (\v -> IntMap.updateMax (const v) m) <$> f k a
#endif
Nothing -> pure m