seqid 0.3.2 → 0.4.0
raw patch · 2 files changed
+31/−17 lines, 2 filesdep ~base
Dependency ranges changed: base
Files
- seqid.cabal +1/−1
- src/Data/SequenceId.hs +30/−16
seqid.cabal view
@@ -1,5 +1,5 @@ name: seqid-version: 0.3.2+version: 0.4.0 synopsis: Sequence ID production and consumption description: Uniquely identify elements in a sequence. License: BSD3
src/Data/SequenceId.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+ module Data.SequenceId ( checkSeqId , incrementSeqId@@ -6,29 +8,44 @@ , checkSeqIdM , incrementSeqIdM , lastSeqIdM- , SequenceIdT+ , SequenceIdT (..)+ , runSequenceIdT+ , execSequenceIdT , evalSequenceIdT -- * Types , SequenceIdError (..) , SequenceIdErrorType (..)- , SequenceId+ , SequenceId (..) ) where -import Control.Monad.Trans.State (StateT, evalStateT, get, modify',- put)+import Control.Applicative (Applicative)+import Control.Monad.State.Class (MonadState, get, modify', put)+import Control.Monad.Trans.Class (MonadTrans)+import Control.Monad.Trans.State (StateT (..), evalStateT, execStateT) import Data.Word (Word32) -type SequenceIdT = StateT SequenceId-type SequenceId = Word32+newtype SequenceIdT m a = SequenceIdT { unSequenceIdT :: StateT SequenceId m a }+ deriving (Monad, Applicative, Functor, MonadState SequenceId, MonadTrans) +newtype SequenceId = SequenceId { unSequenceId :: Word32 }+ deriving (Show, Eq, Ord, Num, Integral, Real, Enum) + evalSequenceIdT :: Monad m => SequenceIdT m b -> SequenceId -> m b-evalSequenceIdT = evalStateT+evalSequenceIdT = evalStateT . unSequenceIdT +execSequenceIdT :: Monad m => SequenceIdT m b -> SequenceId -> m SequenceId+execSequenceIdT = execStateT . unSequenceIdT+++runSequenceIdT :: Monad m => SequenceIdT m b -> SequenceId -> m (b, SequenceId)+runSequenceIdT = runStateT . unSequenceIdT++ data SequenceIdError = SequenceIdError { errType :: !SequenceIdErrorType@@ -43,8 +60,8 @@ deriving (Eq, Show) ---------------------------------------------------------------------------------- | If the current sequence ID is greater than 1 more than the last sequence ID then the appropriate error is returned.+-- | If the current sequence ID is greater than 1 more than the last+-- sequence ID then the appropriate error is returned. checkSeqIdM :: Monad m => SequenceId -- ^ Current sequence ID -> (SequenceIdT m) (Maybe SequenceIdError) checkSeqIdM currSeq = do@@ -53,8 +70,8 @@ return $ checkSeqId lastSeq currSeq ---------------------------------------------------------------------------------- | If the difference between the sequence IDs is not 1 then the appropriate error is returned.+-- | If the difference between the sequence IDs is not 1 then the+-- appropriate error is returned. checkSeqId :: SequenceId -- ^ Last sequence ID -> SequenceId -- ^ Current sequence ID -> Maybe SequenceIdError@@ -64,24 +81,21 @@ | otherwise = Nothing -delta :: SequenceId -> SequenceId -> Integer-delta lastSeq currSeq = toInteger currSeq - toInteger lastSeq+delta :: SequenceId -> SequenceId -> Int+delta lastSeq currSeq = fromIntegral currSeq - fromIntegral lastSeq ------------------------------------------------------------------------------- -- | Update to the next sequense ID incrementSeqIdM :: Monad m => SequenceIdT m SequenceId -- ^ Next sequence ID incrementSeqIdM = modify' incrementSeqId >> get ------------------------------------------------------------------------------- -- | Increment to the next sequense ID incrementSeqId :: SequenceId -- ^ Last sequence ID -> SequenceId -- ^ Next sequence ID incrementSeqId = (+1) ------------------------------------------------------------------------------- -- | Last seen sequense ID lastSeqIdM :: Monad m => SequenceIdT m SequenceId -- ^ Last sequence ID lastSeqIdM = get