module IxMap( IxMap, empty, insert, delete, (!), fromList, toList) where import qualified Data.Map as M data IxMap a = IxMap { ixMapData :: M.Map Int a , ixMapFreshIds :: [Int] } instance Functor IxMap where fmap f a = a{ ixMapData = M.map f $ ixMapData a} empty :: IxMap a empty = IxMap M.empty [0 ..] insert :: a -> IxMap a -> (IxMap a, Int) insert a m = (IxMap (M.insert k a (ixMapData m)) ks, k) where k:ks = ixMapFreshIds m delete :: Int -> IxMap a -> IxMap a delete k m = IxMap (M.delete k $ ixMapData m) (k : ixMapFreshIds m) fromList :: [a] -> IxMap a fromList as = IxMap (M.fromList (zip [0..] as)) [n..] where n = length as (!) :: IxMap a -> Int -> a (!) m k = ixMapData m M.! k toList :: IxMap a -> [(Int, a)] toList = M.toList . ixMapData