seqid (empty) → 0.1.0
raw patch · 4 files changed
+81/−0 lines, 4 filesdep +basedep +transformerssetup-changed
Dependencies added: base, transformers
Files
- LICENSE +0/−0
- Setup.hs +2/−0
- seqid.cabal +19/−0
- src/Data/SequenceId.hs +60/−0
+ LICENSE view
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ seqid.cabal view
@@ -0,0 +1,19 @@+name: seqid+version: 0.1.0+synopsis: Sequence ID production and consumption+description: Uniquely identify elements in a sequence.+License: BSD3+License-file: LICENSE+author: Luke Hoersten+maintainer: luke@hoersten.org+category: Data+build-type: Simple+cabal-version: >= 1.10++library+ exposed-modules: Data.SequenceId+ build-depends: base >= 4.7 && < 4.8+ , transformers >= 0.4 && < 0.5++ hs-source-dirs: src+ default-language: Haskell2010
+ src/Data/SequenceId.hs view
@@ -0,0 +1,60 @@+module Data.SequenceId+ ( checkSeqIdM+ , checkSeqId+ , nextSeqIdM+ , nextSeqId+ , SequenceError (..)+ , SequenceIds (..)+ , SequenceId+ , SequenceT+ , evalSequenceT+ ) where+++import Control.Monad.Trans.State (StateT, evalStateT, gets, modify,+ put)+import Data.Word (Word32)+++newtype LastSeqId = LastSeqId { unLastSeqId :: SequenceId } deriving Show+type SequenceT = StateT LastSeqId+type SequenceId = Word32+++evalSequenceT :: Monad m => SequenceId -> StateT LastSeqId m b -> m b+evalSequenceT = flip evalStateT . LastSeqId+++data SequenceIds =+ SequenceIds+ { lastSeqId :: SequenceId+ , currSeqId :: SequenceId+ } deriving (Eq, Show)+++data SequenceError+ = SequenceIdDropped SequenceIds+ | SequenceIdDuplicated SequenceIds+ deriving (Eq, Show)+++checkSeqIdM :: Monad m => SequenceId -> (SequenceT m) (Maybe SequenceError)+checkSeqIdM currSeq = do+ lastSeq <- gets unLastSeqId+ put $ LastSeqId currSeq+ return $ checkSeqId lastSeq currSeq+++checkSeqId :: SequenceId -> SequenceId -> Maybe SequenceError+checkSeqId lastSeq currSeq+ | (currSeq - lastSeq) > 1 = Just . SequenceIdDropped $ SequenceIds lastSeq currSeq+ | (currSeq - lastSeq) < 1 = Just . SequenceIdDuplicated $ SequenceIds lastSeq currSeq+ | otherwise = Nothing+++nextSeqIdM :: Monad m => SequenceT m SequenceId+nextSeqIdM = modify (LastSeqId . nextSeqId . unLastSeqId) >> gets unLastSeqId+++nextSeqId :: SequenceId -> SequenceId+nextSeqId = (+1)