packages feed

seqid-streams (empty) → 0.1.0

raw patch · 4 files changed

+76/−0 lines, 4 filesdep +basedep +io-streamsdep +seqidsetup-changed

Dependencies added: base, io-streams, seqid

Files

+ LICENSE view
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ seqid-streams.cabal view
@@ -0,0 +1,22 @@+name:                seqid-streams+version:             0.1.0+synopsis:            Sequence ID IO-Streams+description:         Uniquely identify elements in a sequenced stream+License:             BSD3+License-file:        LICENSE+author:              Luke Hoersten+maintainer:          luke@hoersten.org+category:            IO-Streams+build-type:          Simple+cabal-version:       >= 1.10++library+  exposed-modules: System.IO.Streams.SequenceId++  build-depends: base       >= 4.7 && < 4.8+               , io-streams >= 1.2 && < 1.3+               , seqid      >= 0.1 && < 0.2+++  hs-source-dirs:      src+  default-language:    Haskell2010
+ src/System/IO/Streams/SequenceId.hs view
@@ -0,0 +1,52 @@+module System.IO.Streams.SequenceId where++import           Control.Applicative ((<$>))+import           Data.SequenceId     (SequenceError, SequenceId, checkSeqId,+                                      nextSeqId)+import           System.IO.Streams   (InputStream, OutputStream)+import qualified System.IO.Streams   as Streams+++------------------------------------------------------------------------------+-- | Wrap an 'System.IO.Streams.InputStream' and check for dropped or duplicated sequence IDs.+--+-- Example:+--+-- @+-- ghci> 'System.IO.Streams.fromList' [1..10 :: 'Data.SequenceId.SequenceId'] >>= 'sequenceIdInputStream' 0 'id' ('fail' . 'show') >>= 'System.IO.Streams.toList'+-- [1,2,3,4,5,6,7,8,9,10]+--+-- ghci> 'System.IO.Streams.fromList' [5..10 :: 'Data.SequenceId.SequenceId'] >>= 'sequenceIdInputStream' 0 'id' ('fail' . 'show') >>= 'System.IO.Streams.toList'+-- *** Exception: user error ('Data.SequenceId.SequenceIdDropped' ('Data.SequenceId.SequenceIds' {lastSeqId = 0, currSeqId = 5}))+--+-- ghci> 'System.IO.Streams.fromList' [5..10 :: 'Data.SequenceId.SequenceId'] >>= 'sequenceIdInputStream' 1 'id' ('fail' . 'show') >>= 'System.IO.Streams.toList'+-- *** Exception: user error ('Data.SequenceId.SequenceIdDuplicated' ('Data.SequenceId.SequenceIds' {lastSeqId = 1, currSeqId = 1}))+-- @+sequenceIdInputStream :: SequenceId                   -- ^ Initial sequence ID+                      -> (a -> SequenceId)            -- ^ Function applied to each element of the stream to get the sequence ID+                      -> (SequenceError -> IO ())     -- ^ Error handler+                      -> InputStream a                -- ^ 'System.IO.Streams.InputStream' to check the sequence of+                      -> IO (InputStream a)           -- ^ Pass-through of the given stream+sequenceIdInputStream initSeqId getSeqId seqFaultHandler inStream = fst <$> Streams.inputFoldM f initSeqId inStream+  where+    f lastSeqId x = do+        let currSeqId = getSeqId x+            check = checkSeqId lastSeqId currSeqId+        maybe (return ()) seqFaultHandler check+        return currSeqId+++------------------------------------------------------------------------------+-- | Wrap an 'System.IO.Streams.OutputStream' to give a sequence ID for each element written.+--+-- Example:+--+-- @+-- (outStream', getSeqId) <- 'sequenceIdOutputStream' 1 outStream+-- return $ 'System.IO.Streams.Combinators.contramapM' (addSeqId getSeqId) outStream'+-- @+sequenceIdOutputStream :: SequenceId                         -- ^ Initial sequence ID+                       -> OutputStream a                     -- ^ 'System.IO.Streams.OutputStream' to count the elements of+                       -> IO (OutputStream a, IO SequenceId) -- ^ ('IO' 'SequenceId') is the action to run to get the current sequence ID+sequenceIdOutputStream = Streams.outputFoldM count+  where count a _ = return $ nextSeqId a