iteratee-mtl 0.4.0.2 → 0.5.0.0
raw patch · 5 files changed
+59/−28 lines, 5 filesdep ~basedep ~containersPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, containers
API changes (from Hackage documentation)
- Data.Iteratee.Base: instance (Eq c) => Eq (Stream c)
- Data.Iteratee.Base: instance (Monoid c) => Monoid (Stream c)
- Data.Iteratee.Base: instance (NullPoint s) => MonadTrans (Iteratee s)
- Data.Iteratee.Base: instance (Show c) => Show (Stream c)
+ Data.Iteratee.Base: instance Eq c => Eq (Stream c)
+ Data.Iteratee.Base: instance Monoid c => Monoid (Stream c)
+ Data.Iteratee.Base: instance NullPoint s => MonadTrans (Iteratee s)
+ Data.Iteratee.Base: instance Show c => Show (Stream c)
+ Data.Iteratee.ListLike: roll :: (Monad m, Functor m, Nullable s, ListLike s el, ListLike s' s) => Int -> Int -> Iteratee s m s'
- Data.Iteratee.Base: icontM :: (Monad m) => (Stream s -> Iteratee s m a) -> Maybe SomeException -> m (Iteratee s m a)
+ Data.Iteratee.Base: icontM :: Monad m => (Stream s -> Iteratee s m a) -> Maybe SomeException -> m (Iteratee s m a)
- Data.Iteratee.Base: idone :: (Monad m) => a -> Stream s -> Iteratee s m a
+ Data.Iteratee.Base: idone :: Monad m => a -> Stream s -> Iteratee s m a
- Data.Iteratee.Base: idoneM :: (Monad m) => a -> Stream s -> m (Iteratee s m a)
+ Data.Iteratee.Base: idoneM :: Monad m => a -> Stream s -> m (Iteratee s m a)
- Data.Iteratee.Base: liftI :: (Monad m) => (Stream s -> Iteratee s m a) -> Iteratee s m a
+ Data.Iteratee.Base: liftI :: Monad m => (Stream s -> Iteratee s m a) -> Iteratee s m a
- Data.Iteratee.Base: run :: (Monad m) => Iteratee s m a -> m a
+ Data.Iteratee.Base: run :: Monad m => Iteratee s m a -> m a
- Data.Iteratee.Base.LooseMap: lMap :: (LooseMap c el el') => (el -> el') -> c el -> c el'
+ Data.Iteratee.Base.LooseMap: lMap :: LooseMap c el el' => (el -> el') -> c el -> c el'
- Data.Iteratee.Base.ReadableChunk: class (Storable el) => ReadableChunk s el | s -> el
+ Data.Iteratee.Base.ReadableChunk: class Storable el => ReadableChunk s el | s -> el
- Data.Iteratee.Char: enumLinesBS :: (Monad m) => Enumeratee ByteString [ByteString] m a
+ Data.Iteratee.Char: enumLinesBS :: Monad m => Enumeratee ByteString [ByteString] m a
- Data.Iteratee.Char: enumWordsBS :: (Monad m) => Enumeratee ByteString [ByteString] m a
+ Data.Iteratee.Char: enumWordsBS :: Monad m => Enumeratee ByteString [ByteString] m a
- Data.Iteratee.Exception: class (Exception e) => IException e
+ Data.Iteratee.Exception: class Exception e => IException e
- Data.Iteratee.Exception: fromIterException :: (IException e) => IterException -> Maybe e
+ Data.Iteratee.Exception: fromIterException :: IException e => IterException -> Maybe e
- Data.Iteratee.Exception: toIterException :: (IException e) => e -> IterException
+ Data.Iteratee.Exception: toIterException :: IException e => e -> IterException
- Data.Iteratee.Iteratee: (>>>) :: (Monad m) => Enumerator s m a -> Enumerator s m a -> Enumerator s m a
+ Data.Iteratee.Iteratee: (>>>) :: Monad m => Enumerator s m a -> Enumerator s m a -> Enumerator s m a
- Data.Iteratee.Iteratee: enumCheckIfDone :: (Monad m) => Iteratee s m a -> m (Bool, Iteratee s m a)
+ Data.Iteratee.Iteratee: enumCheckIfDone :: Monad m => Iteratee s m a -> m (Bool, Iteratee s m a)
- Data.Iteratee.Iteratee: enumChunk :: (Monad m) => Stream s -> Enumerator s m a
+ Data.Iteratee.Iteratee: enumChunk :: Monad m => Stream s -> Enumerator s m a
- Data.Iteratee.Iteratee: enumEof :: (Monad m) => Enumerator s m a
+ Data.Iteratee.Iteratee: enumEof :: Monad m => Enumerator s m a
- Data.Iteratee.Iteratee: enumFromCallback :: (Monad m, NullPoint s) => m (Either SomeException (Bool, s)) -> Enumerator s m a
+ Data.Iteratee.Iteratee: enumFromCallback :: (Monad m, NullPoint s) => (st -> m (Either SomeException ((Bool, st), s))) -> st -> Enumerator s m a
- Data.Iteratee.Iteratee: enumFromCallbackCatch :: (IException e, Monad m, NullPoint s) => m (Either SomeException (Bool, s)) -> (e -> m (Maybe EnumException)) -> Enumerator s m a
+ Data.Iteratee.Iteratee: enumFromCallbackCatch :: (IException e, Monad m, NullPoint s) => (st -> m (Either SomeException ((Bool, st), s))) -> (e -> m (Maybe EnumException)) -> st -> Enumerator s m a
- Data.Iteratee.Iteratee: enumPure1Chunk :: (Monad m) => s -> Enumerator s m a
+ Data.Iteratee.Iteratee: enumPure1Chunk :: Monad m => s -> Enumerator s m a
- Data.Iteratee.Iteratee: isStreamFinished :: (Monad m) => Iteratee s m (Maybe SomeException)
+ Data.Iteratee.Iteratee: isStreamFinished :: Monad m => Iteratee s m (Maybe SomeException)
- Data.Iteratee.Iteratee: joinIM :: (Monad m) => m (Iteratee s m a) -> Iteratee s m a
+ Data.Iteratee.Iteratee: joinIM :: Monad m => m (Iteratee s m a) -> Iteratee s m a
- Data.Iteratee.Iteratee: skipToEof :: (Monad m) => Iteratee s m ()
+ Data.Iteratee.Iteratee: skipToEof :: Monad m => Iteratee s m ()
- Data.Iteratee.Iteratee: throwErr :: (Monad m) => SomeException -> Iteratee s m a
+ Data.Iteratee.Iteratee: throwErr :: Monad m => SomeException -> Iteratee s m a
- Data.Iteratee.Iteratee: throwRecoverableErr :: (Monad m) => SomeException -> (Stream s -> Iteratee s m a) -> Iteratee s m a
+ Data.Iteratee.Iteratee: throwRecoverableErr :: Monad m => SomeException -> (Stream s -> Iteratee s m a) -> Iteratee s m a
- Data.NullPoint: empty :: (NullPoint c) => c
+ Data.NullPoint: empty :: NullPoint c => c
- Data.Nullable: class (NullPoint c) => Nullable c
+ Data.Nullable: class NullPoint c => Nullable c
- Data.Nullable: null :: (Nullable c) => c -> Bool
+ Data.Nullable: null :: Nullable c => c -> Bool
Files
- iteratee-mtl.cabal +7/−7
- src/Data/Iteratee/IO/Fd.hs +8/−6
- src/Data/Iteratee/IO/Handle.hs +8/−6
- src/Data/Iteratee/Iteratee.hs +12/−9
- src/Data/Iteratee/ListLike.hs +24/−0
iteratee-mtl.cabal view
@@ -1,5 +1,5 @@ name: iteratee-mtl-version: 0.4.0.2+version: 0.5.0.0 synopsis: Iteratee-based I/O description: The Iteratee monad provides strict, safe, and functional I/O. In addition@@ -37,7 +37,7 @@ if flag(splitBase) build-depends:- base >= 3 && < 5+ base >= 3 && < 6 else build-depends: base < 3@@ -55,11 +55,11 @@ unix >= 2 && < 3 build-depends:- ListLike >= 1.0 && < 2,- MonadCatchIO-mtl > 0.3 && < 0.4,- bytestring >= 0.9 && < 0.10,- containers >= 0.2 && < 0.4,- mtl >= 1.1 && < 1.2+ ListLike >= 1.0 && < 2,+ MonadCatchIO-mtl > 0.3 && < 0.4,+ bytestring >= 0.9 && < 0.10,+ containers >= 0.2 && < 0.5,+ mtl >= 1.1 && < 1.2 exposed-modules: Data.Nullable
src/Data/Iteratee/IO/Fd.hs view
@@ -47,14 +47,16 @@ Ptr el -> ByteCount -> Fd- -> m (Either SomeException (Bool, s))-makefdCallback p bufsize fd = do+ -> st+ -> m (Either SomeException ((Bool, st), s))+makefdCallback p bufsize fd st = do liftIO $ GHC.Conc.threadWaitRead fd n <- liftIO $ myfdRead fd (castPtr p) bufsize case n of Left _ -> return $ Left undefined- Right 0 -> return $ Right (False, empty)- Right n' -> liftM (\s -> Right (True, s)) $ readFromPtr p (fromIntegral n')+ Right 0 -> return $ Right ((False, st), empty)+ Right n' -> liftM (\s -> Right ((True, st), s)) $+ readFromPtr p (fromIntegral n') -- |The enumerator of a POSIX File Descriptor. This version enumerates -- over the entire contents of a file, in order, unless stopped by@@ -67,7 +69,7 @@ enumFd bs fd iter = do let bufsize = bs * (sizeOf (undefined :: el)) p <- liftIO $ mallocBytes bufsize- enumFromCallback (makefdCallback p (fromIntegral bufsize) fd) iter+ enumFromCallback (makefdCallback p (fromIntegral bufsize) fd) () iter -- |A variant of enumFd that catches exceptions raised by the @Iteratee@. enumFdCatch@@ -80,7 +82,7 @@ let bufsize = bs * (sizeOf (undefined :: el)) p <- liftIO $ mallocBytes bufsize enumFromCallbackCatch (makefdCallback p (fromIntegral bufsize) fd)- handler iter+ handler () iter -- |The enumerator of a POSIX File Descriptor: a variation of @enumFd@ that
src/Data/Iteratee/IO/Handle.hs view
@@ -41,13 +41,15 @@ Ptr el -> Int -> Handle- -> m (Either SomeException (Bool, s))-makeHandleCallback p bsize h = do+ -> st+ -> m (Either SomeException ((Bool, st), s))+makeHandleCallback p bsize h st = do n' <- liftIO (CIO.try $ hGetBuf h p bsize :: IO (Either SomeException Int)) case n' of Left e -> return $ Left e- Right 0 -> return $ Right (False, empty)- Right n -> liftM (\s -> Right (True, s)) $ readFromPtr p (fromIntegral n)+ Right 0 -> return $ Right ((False, st), empty)+ Right n -> liftM (\s -> Right ((True, st), s)) $+ readFromPtr p (fromIntegral n) -- |The (monadic) enumerator of a file Handle. This version enumerates@@ -62,7 +64,7 @@ enumHandle bs h i = do let bufsize = bs * sizeOf (undefined :: el) p <- liftIO $ mallocBytes bufsize- enumFromCallback (makeHandleCallback p bufsize h) i+ enumFromCallback (makeHandleCallback p bufsize h) () i -- |An enumerator of a file handle that catches exceptions raised by -- the Iteratee.@@ -79,7 +81,7 @@ enumHandleCatch bs h handler i = do let bufsize = bs * sizeOf (undefined :: el) p <- liftIO $ mallocBytes bufsize- enumFromCallbackCatch (makeHandleCallback p bufsize h) handler i+ enumFromCallbackCatch (makeHandleCallback p bufsize h) handler () i -- |The enumerator of a Handle: a variation of enumHandle that
src/Data/Iteratee/Iteratee.hs view
@@ -256,10 +256,11 @@ -- |Create an enumerator from a callback function enumFromCallback :: (Monad m, NullPoint s) =>- m (Either SomeException (Bool, s))+ (st -> m (Either SomeException ((Bool, st), s)))+ -> st -> Enumerator s m a-enumFromCallback = flip enumFromCallbackCatch- (\NotAnException -> return Nothing)+enumFromCallback c st =+ enumFromCallbackCatch c (\NotAnException -> return Nothing) st -- Dummy exception to catch in enumFromCallback -- This never gets thrown, but it lets us@@ -274,17 +275,19 @@ -- The exception handler is called if an iteratee reports an exception. enumFromCallbackCatch :: (IException e, Monad m, NullPoint s) =>- m (Either SomeException (Bool, s))+ (st -> m (Either SomeException ((Bool, st), s))) -> (e -> m (Maybe EnumException))+ -> st -> Enumerator s m a enumFromCallbackCatch c handler = loop where- loop iter = runIter iter idoneM on_cont- on_cont k Nothing = c >>= either (return . k . EOF . Just) (uncurry check)+ loop st iter = runIter iter idoneM (on_cont st)+ on_cont st k Nothing = c st >>=+ either (return . k . EOF . Just) (uncurry check) where- check b = if b then loop . k . Chunk else return . k . Chunk- on_cont k j@(Just e) = case fromException e of- Just e' -> handler e' >>= maybe (loop . k $ Chunk empty)+ check (b,st') = if b then loop st' . k . Chunk else return . k . Chunk+ on_cont st k j@(Just e) = case fromException e of+ Just e' -> handler e' >>= maybe (loop st . k $ Chunk empty) (return . icont k . Just) . fmap toException Nothing -> return (icont k j)
src/Data/Iteratee/ListLike.hs view
@@ -20,6 +20,7 @@ ,head ,heads ,peek+ ,roll ,length -- ** Nested iteratee combinators ,take@@ -51,6 +52,7 @@ import qualified Data.ListLike.FoldableLL as FLL import Data.Iteratee.Iteratee import Control.Monad.Trans+import Control.Applicative import Data.Monoid import Data.Word (Word8) import qualified Data.ByteString as B@@ -168,6 +170,28 @@ | True = idone (Just $ LL.head vec) s step stream = idone Nothing stream {-# INLINE peek #-}++-- | Return a chunk of `t' elements length, while consuming `d' elements+-- from the stream. Useful for creating a "rolling average" with convStream.+roll :: (Monad m, Functor m, Nullable s, LL.ListLike s el, LL.ListLike s' s) =>+ Int+ -> Int+ -> Iteratee s m s'+roll t d | t > d = liftI step+ where+ step (Chunk vec)+ | LL.length vec >= d =+ idone (LL.singleton $ LL.take t vec) (Chunk $ LL.drop d vec)+ | LL.length vec >= t =+ idone (LL.singleton $ LL.take t vec) mempty <* drop (d-LL.length vec)+ | LL.null vec = liftI step+ | True = liftI (step' vec)+ step stream = idone LL.empty stream+ step' v1 (Chunk vec) = step . Chunk $ v1 `mappend` vec+ step' v1 stream = idone (LL.singleton v1) stream+roll t d = LL.singleton <$> joinI (take t stream2stream) <* drop (d-t)+ -- d is >= t, so this version works+{-# INLINE roll #-} -- |Drop n elements of the stream, if there are that many.