packages feed

Haskelloids-0.1.1: src/Data/IdentityList.hs

module Data.IdentityList (IList,
                          ILKey,
                          empty,
                          insert,
                          insertMany,
                          fromList,
                          elems,
                          assocs,
                          delete,
                          deleteMany,
                          mapWithKey
                         ) where

import Data.Word (Word32)

import qualified Data.Map as Map (Map, empty, insert, lookup, elems, assocs,
                                  delete, mapWithKey)

type ILKey = Word32 -- NB: maximum of 2^32 objects can be inserted after initialisation

data IList a = IL {
  ilNextKey :: ILKey,
  ilAssocs  :: Map.Map ILKey a
} deriving (Show)

empty :: IList a
empty = IL { ilNextKey = minBound,
             ilAssocs = Map.empty  }

insert :: IList a -> a -> IList a
insert (IL nxtKy assc) e = IL (succ nxtKy) assc'
  where assc' = Map.insert nxtKy e assc

insertMany :: IList a -> [a] -> IList a
insertMany = foldl insert

fromList :: [a] -> IList a
fromList = insertMany empty

elems :: IList a -> [a]
elems = Map.elems . ilAssocs

assocs :: IList a -> [(ILKey, a)]
assocs = Map.assocs . ilAssocs

delete :: IList a -> ILKey -> IList a
delete (IL nxtKy map) k = IL nxtKy (Map.delete k map)

deleteMany :: IList a -> [ILKey] -> IList a
deleteMany = foldl delete

mapWithKey :: (ILKey -> a -> b) -> IList a -> IList b
mapWithKey f il = il { ilAssocs = Map.mapWithKey f . ilAssocs $ il }

instance Functor IList where
  fmap f (IL nxtKy assc) = IL nxtKy (fmap f assc)