43 lines
1.3 KiB
Haskell
43 lines
1.3 KiB
Haskell
module IntMapHelp
|
|
( module Data.IntMap.Strict
|
|
, newKey
|
|
, insertNewKey
|
|
, insertWithNewKeys
|
|
, unsafeSwapKeys
|
|
, safeSwapKeys
|
|
, findIndex
|
|
) where
|
|
import LensHelp
|
|
--import Data.List hiding (foldr,insert)
|
|
import Data.IntMap.Strict
|
|
{- | Find a key value one higher than any key in the map, or zero if the map is
|
|
- empty -}
|
|
newKey :: IntMap a -> Int
|
|
newKey = maybe 0 ((+ 1) . fst) . lookupMax
|
|
{- | Insert an element with some new key. -}
|
|
insertNewKey :: a -> IntMap a -> IntMap a
|
|
insertNewKey x m = case lookupMax m of
|
|
Nothing -> singleton 0 x
|
|
Just (k,_) -> insert (k+1) x m
|
|
{- | Insert a list of values with new keys -}
|
|
insertWithNewKeys :: [a] -> IntMap a -> IntMap a
|
|
insertWithNewKeys xs m = union m $ fromList $ zip [newKey m..] xs
|
|
{- | Swaps two keys. Unsafe: assumes both keys exist. -}
|
|
unsafeSwapKeys :: Int -> Int -> IntMap a -> IntMap a
|
|
unsafeSwapKeys i j m = insert i (m ! j) $ insert j (m ! i) m
|
|
|
|
safeSwapKeys :: Int -> Int -> IntMap a -> IntMap a
|
|
safeSwapKeys i j m = m
|
|
& at i .~ (m ^? ix j)
|
|
& at j .~ (m ^? ix i)
|
|
|
|
-- ideally this should short circuit, I am not sure whether it does or not
|
|
-- though
|
|
findIndex :: (a -> Bool) -> IntMap a -> Maybe Int
|
|
findIndex t = foldrWithKey f Nothing
|
|
where
|
|
f _ _ (Just k) = Just k
|
|
f k x _
|
|
| t x = Just k
|
|
| otherwise = Nothing
|