module Data.Map.Utils
( insert'
)
where
import Data.Map (Map, insertLookupWithKey)
import Data.Maybe (isJust)
import Prelude hiding (map)
insert' :: (Ord k) => k -> v -> Map k v -> Maybe (Map k v)
insert' :: forall k v. Ord k => k -> v -> Map k v -> Maybe (Map k v)
insert' k
k v
v' Map k v
map =
let (Maybe v
mV, Map k v
map') = (k -> v -> v -> v) -> k -> v -> Map k v -> (Maybe v, Map k v)
forall k a.
Ord k =>
(k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a)
insertLookupWithKey k -> v -> v -> v
forall {p} {p} {p}. p -> p -> p -> p
upd k
k v
v' Map k v
map
in if Maybe v -> Bool
forall a. Maybe a -> Bool
isJust Maybe v
mV
then Maybe (Map k v)
forall a. Maybe a
Nothing
else Map k v -> Maybe (Map k v)
forall a. a -> Maybe a
Just Map k v
map'
where
upd :: p -> p -> p -> p
upd p
_ p
oldV p
_ = p
oldV