packages feed

click-clack-1.0.1: src/IxMap.hs

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