{-# LANGUAGE ConstraintKinds #-}
module Database.Haskey.Utils.STM.Map where

import Control.Applicative ((<$>))
import Control.Concurrent.STM (STM)

import qualified Focus as F
import qualified ListT as L

import STMContainers.Map (Map, Key)
import qualified STMContainers.Map as M

lookupMin :: Map k v -> STM (Maybe (k, v))
lookupMin = L.head . M.stream

lookupMinKey :: Map k v -> STM (Maybe k)
lookupMinKey = ((fst <$>) <$>) . lookupMin

alter :: Key k => k -> (Maybe v -> Maybe v) -> Map k v -> STM ()
alter k f = M.focus (F.alterM (return . f)) k