http-monad 0.1.0.3 → 0.1.1
raw patch · 3 files changed
+36/−20 lines, 3 filesdep ~lazyio
Dependency ranges changed: lazyio
Files
- http-monad.cabal +3/−3
- src/Network/Monad/Transfer.hs +15/−7
- src/Network/Monad/Transfer/ChunkyLazyIO.hs +18/−10
http-monad.cabal view
@@ -1,5 +1,5 @@ Name: http-monad-Version: 0.1.0.3+Version: 0.1.1 Cabal-Version: >= 1.6 Build-type: Simple License: BSD3@@ -29,7 +29,7 @@ Source-Repository this type: darcs location: http://code.haskell.org/~thielema/http-monad/- tag: 0.1.0.3+ tag: 0.1.1 Flag splitBase description: Old, monolithic base@@ -61,7 +61,7 @@ Build-depends: transformers >=0.2 && <0.4 Build-depends: explicit-exception >=0.1.4 && <0.2 Build-depends: utility-ht >=0.0.4 && <0.1- Build-depends: lazyio >=0.0.2 && <0.1+ Build-depends: lazyio >=0.1 && <0.2 If flag(splitBase) Build-depends: base < 3
src/Network/Monad/Transfer.hs view
@@ -42,18 +42,26 @@ } +liftSync :: Monad m =>+ m (Stream.Result a) -> SyncExceptional m a+liftSync = Sync.fromEitherT++liftAsync :: (Monad m, Monoid a) =>+ m (Stream.Result a) -> AsyncExceptional m a+liftAsync =+ Async.mapExceptionalT unwrapMonad .+ Async.fromSynchronousMonoidT .+ Sync.mapExceptionalT WrapMonad .+ liftSync++ liftIOSync :: MonadIO io => IO (Stream.Result a) -> SyncExceptional io a-liftIOSync m =- Sync.fromEitherT $ liftIO m+liftIOSync = liftSync . liftIO liftIOAsync :: (MonadIO io, Monoid a) => IO (Stream.Result a) -> AsyncExceptional io a-liftIOAsync =- Async.mapExceptionalT unwrapMonad .- Async.fromSynchronousMonoidT .- Sync.mapExceptionalT WrapMonad .- liftIOSync+liftIOAsync = liftAsync . liftIO {- liftIOAsync = Async.ExceptionalT .
src/Network/Monad/Transfer/ChunkyLazyIO.hs view
@@ -51,9 +51,12 @@ Transfer.T LazyIO.T body transfer chunkSize h = Transfer.Cons {- Transfer.readLine = Transfer.liftIOAsync $ TCP.readLine h,- Transfer.readBlock = \n -> readBlockChunky chunkSize h n,- Transfer.writeBlock = \str -> Transfer.liftIOSync $ TCP.writeBlock h str+ Transfer.readLine =+ Transfer.liftAsync $ LazyIO.interleave $ TCP.readLine h,+ Transfer.readBlock = \n ->+ readBlockChunky chunkSize h n,+ Transfer.writeBlock = \str ->+ Transfer.liftSync $ LazyIO.interleave $ TCP.writeBlock h str } run :: (TCP.HStream body, Body body) =>@@ -66,15 +69,20 @@ readBlockChunky :: (TCP.HStream body, Body body) =>- Int -> TCP.HandleStream body -> Int -> Transfer.AsyncExceptional LazyIO.T body+ Int -> TCP.HandleStream body ->+ Int -> Transfer.AsyncExceptional LazyIO.T body readBlockChunky chunkSize h = let go todo = if todo>0- then -- we cannot use 'mappend' because 'length str' is needed- do (Transfer.liftIOAsync $- TCP.readBlock h (min chunkSize todo))- `Async.bindT`- (\str ->- fmap (mappend str) $ go (max 0 (todo - length str)))+ then+ {-+ We must use `bindT` instead of 'mappend'+ because we need 'length str'.+ -}+ (Transfer.liftAsync $ LazyIO.interleave $+ TCP.readBlock h (min chunkSize todo))+ `Async.bindT`+ (\str ->+ fmap (mappend str) $ go (max 0 (todo - length str))) else mempty in go