summaryrefslogtreecommitdiff
path: root/haskell
diff options
context:
space:
mode:
authorHideyuki Tanaka <tanaka.hideyuki@gmail.com>2010-05-04 16:22:04 +0900
committerHideyuki Tanaka <tanaka.hideyuki@gmail.com>2010-05-04 16:22:04 +0900
commit674c26d9c7213744193d8dd9b5269be66a80c4d5 (patch)
tree9dcb162961050af23af64814a9717f904b6c339c /haskell
parent7b68b04efdd400b9d851201ae4d7ba47f30e74e2 (diff)
downloadmsgpack-python-674c26d9c7213744193d8dd9b5269be66a80c4d5.tar.gz
fix feed function from Handle
Diffstat (limited to 'haskell')
-rw-r--r--haskell/msgpack.cabal2
-rw-r--r--haskell/src/Data/MessagePack/Feed.hs12
-rw-r--r--haskell/src/Data/MessagePack/Monad.hs17
3 files changed, 19 insertions, 12 deletions
diff --git a/haskell/msgpack.cabal b/haskell/msgpack.cabal
index 505a2b9..31cad3b 100644
--- a/haskell/msgpack.cabal
+++ b/haskell/msgpack.cabal
@@ -1,5 +1,5 @@
Name: msgpack
-Version: 0.2.0
+Version: 0.2.1
License: BSD3
License-File: LICENSE
Author: Hideyuki Tanaka
diff --git a/haskell/src/Data/MessagePack/Feed.hs b/haskell/src/Data/MessagePack/Feed.hs
index afd3f6c..93bdd9b 100644
--- a/haskell/src/Data/MessagePack/Feed.hs
+++ b/haskell/src/Data/MessagePack/Feed.hs
@@ -33,12 +33,16 @@ type Feeder = IO (Maybe ByteString)
-- | Feeder from Handle
feederFromHandle :: Handle -> IO Feeder
feederFromHandle h = return $ do
- bs <- BS.hGet h bufSize
+ bs <- BS.hGetNonBlocking h bufSize
if BS.length bs > 0
- then return $ Just bs
+ then do return $ Just bs
else do
- hClose h
- return Nothing
+ bs <- BS.hGet h 1
+ if BS.length bs > 0
+ then do return $ Just bs
+ else do
+ hClose h
+ return Nothing
where
bufSize = 4096
diff --git a/haskell/src/Data/MessagePack/Monad.hs b/haskell/src/Data/MessagePack/Monad.hs
index bf1514f..cf3a0fd 100644
--- a/haskell/src/Data/MessagePack/Monad.hs
+++ b/haskell/src/Data/MessagePack/Monad.hs
@@ -115,18 +115,21 @@ instance MonadIO m => MonadIO (UnpackerT m) where
instance MonadIO m => MonadUnpacker (UnpackerT m) where
get = UnpackerT $ \up feed -> liftIO $ do
- resp <- unpackerExecute up
- guard $ resp>=0
- when (resp==0) $ do
- Just bs <- feed
- unpackerFeed up bs
- resp2 <- unpackerExecute up
- guard $ resp2==1
+ executeOne up feed
obj <- unpackerData up
freeZone =<< unpackerReleaseZone up
unpackerReset up
let Right r = fromObject obj
return r
+
+ where
+ executeOne up feed = do
+ resp <- unpackerExecute up
+ guard $ resp>=0
+ when (resp==0) $ do
+ Just bs <- feed
+ unpackerFeed up bs
+ executeOne up feed
-- | Execute deserializer using given feeder.
unpackFrom :: MonadIO m => Feeder -> UnpackerT m r -> m r