seqid 0.1.0 → 0.2.0
raw patch · 2 files changed
+51/−31 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Data.SequenceId: SequenceIds :: SequenceId -> SequenceId -> SequenceIds
- Data.SequenceId: data SequenceError
- Data.SequenceId: data SequenceIds
- Data.SequenceId: evalSequenceT :: Monad m => SequenceId -> StateT LastSeqId m b -> m b
- Data.SequenceId: instance Eq SequenceError
- Data.SequenceId: instance Eq SequenceIds
- Data.SequenceId: instance Show LastSeqId
- Data.SequenceId: instance Show SequenceError
- Data.SequenceId: instance Show SequenceIds
- Data.SequenceId: type SequenceT = StateT LastSeqId
+ Data.SequenceId: SequenceIdError :: !SequenceIdErrorType -> !SequenceId -> !SequenceId -> SequenceIdError
+ Data.SequenceId: data SequenceIdError
+ Data.SequenceId: data SequenceIdErrorType
+ Data.SequenceId: errType :: SequenceIdError -> !SequenceIdErrorType
+ Data.SequenceId: evalSequenceIdT :: Monad m => SequenceId -> SequenceIdT m b -> m b
+ Data.SequenceId: instance Eq SequenceIdError
+ Data.SequenceId: instance Eq SequenceIdErrorType
+ Data.SequenceId: instance Show SequenceIdError
+ Data.SequenceId: instance Show SequenceIdErrorType
+ Data.SequenceId: type SequenceIdT = StateT SequenceId
- Data.SequenceId: SequenceIdDropped :: SequenceIds -> SequenceError
+ Data.SequenceId: SequenceIdDropped :: SequenceIdErrorType
- Data.SequenceId: SequenceIdDuplicated :: SequenceIds -> SequenceError
+ Data.SequenceId: SequenceIdDuplicated :: SequenceIdErrorType
- Data.SequenceId: checkSeqId :: SequenceId -> SequenceId -> Maybe SequenceError
+ Data.SequenceId: checkSeqId :: SequenceId -> SequenceId -> Maybe SequenceIdError
- Data.SequenceId: checkSeqIdM :: Monad m => SequenceId -> (SequenceT m) (Maybe SequenceError)
+ Data.SequenceId: checkSeqIdM :: Monad m => SequenceId -> (SequenceIdT m) (Maybe SequenceIdError)
- Data.SequenceId: currSeqId :: SequenceIds -> SequenceId
+ Data.SequenceId: currSeqId :: SequenceIdError -> !SequenceId
- Data.SequenceId: lastSeqId :: SequenceIds -> SequenceId
+ Data.SequenceId: lastSeqId :: SequenceIdError -> !SequenceId
- Data.SequenceId: nextSeqIdM :: Monad m => SequenceT m SequenceId
+ Data.SequenceId: nextSeqIdM :: Monad m => SequenceIdT m SequenceId
Files
- seqid.cabal +1/−1
- src/Data/SequenceId.hs +50/−30
seqid.cabal view
@@ -1,5 +1,5 @@ name: seqid-version: 0.1.0+version: 0.2.0 synopsis: Sequence ID production and consumption description: Uniquely identify elements in a sequence. License: BSD3
src/Data/SequenceId.hs view
@@ -1,60 +1,80 @@ module Data.SequenceId- ( checkSeqIdM- , checkSeqId- , nextSeqIdM+ ( checkSeqId , nextSeqId- , SequenceError (..)- , SequenceIds (..)++ -- * Monadic+ , checkSeqIdM+ , nextSeqIdM+ , SequenceIdT+ , evalSequenceIdT++ -- * Types+ , SequenceIdError (..)+ , SequenceIdErrorType (..) , SequenceId- , SequenceT- , evalSequenceT ) where -import Control.Monad.Trans.State (StateT, evalStateT, gets, modify,+import Control.Monad.Trans.State (StateT, evalStateT, get, modify', put) import Data.Word (Word32) -newtype LastSeqId = LastSeqId { unLastSeqId :: SequenceId } deriving Show-type SequenceT = StateT LastSeqId-type SequenceId = Word32+type SequenceIdT = StateT SequenceId+type SequenceId = Word32 -evalSequenceT :: Monad m => SequenceId -> StateT LastSeqId m b -> m b-evalSequenceT = flip evalStateT . LastSeqId+evalSequenceIdT :: Monad m => SequenceId -> SequenceIdT m b -> m b+evalSequenceIdT = flip evalStateT -data SequenceIds =- SequenceIds- { lastSeqId :: SequenceId- , currSeqId :: SequenceId+data SequenceIdError =+ SequenceIdError+ { errType :: !SequenceIdErrorType+ , lastSeqId :: !SequenceId+ , currSeqId :: !SequenceId } deriving (Eq, Show) -data SequenceError- = SequenceIdDropped SequenceIds- | SequenceIdDuplicated SequenceIds+data SequenceIdErrorType+ = SequenceIdDropped+ | SequenceIdDuplicated deriving (Eq, Show) -checkSeqIdM :: Monad m => SequenceId -> (SequenceT m) (Maybe SequenceError)+------------------------------------------------------------------------------+-- | 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- lastSeq <- gets unLastSeqId- put $ LastSeqId currSeq+ lastSeq <- get+ put $ max lastSeq currSeq return $ checkSeqId lastSeq currSeq -checkSeqId :: SequenceId -> SequenceId -> Maybe SequenceError+------------------------------------------------------------------------------+-- | 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 checkSeqId lastSeq currSeq- | (currSeq - lastSeq) > 1 = Just . SequenceIdDropped $ SequenceIds lastSeq currSeq- | (currSeq - lastSeq) < 1 = Just . SequenceIdDuplicated $ SequenceIds lastSeq currSeq- | otherwise = Nothing+ | delta lastSeq currSeq > 1 = Just $ SequenceIdError SequenceIdDropped lastSeq currSeq+ | delta lastSeq currSeq < 1 = Just $ SequenceIdError SequenceIdDuplicated lastSeq currSeq+ | otherwise = Nothing -nextSeqIdM :: Monad m => SequenceT m SequenceId-nextSeqIdM = modify (LastSeqId . nextSeqId . unLastSeqId) >> gets unLastSeqId+delta :: SequenceId -> SequenceId -> Integer+delta lastSeq currSeq = toInteger currSeq - toInteger lastSeq -nextSeqId :: SequenceId -> SequenceId+------------------------------------------------------------------------------+-- | Update to the next sequense ID+nextSeqIdM :: Monad m => SequenceIdT m SequenceId -- ^ Next sequence ID+nextSeqIdM = modify' nextSeqId >> get+++------------------------------------------------------------------------------+-- | Update to the next sequense ID+nextSeqId :: SequenceId -- ^ Last sequence ID+ -> SequenceId -- ^ Next sequence ID nextSeqId = (+1)