{- | Identifier generator Generates unique elements without recycling of identifiers. -} module Haskore.General.IdGenerator.Simple where import Control.Monad.Trans.State (State, evalState, modify, get, ) import Control.Monad (when, ) {- | The generator is a simple state monad. -} type T i a = State i a run :: i -> T i a -> a run = flip evalState {- | Reserve a new id. -} alloc :: (Enum i) => T i i alloc = do newId <- get modify succ return newId {- | Unreserve an id. In this implementation it performs essentially nothing. -} free :: (Ord i) => i -> T i () free oldId = do freeId <- get when (freeId <= oldId) (error "IdGeneratorSimple.free: freed unreserved id")