fix feed function from Handle

This commit is contained in:
Hideyuki Tanaka 2010-05-04 16:22:04 +09:00
parent 7b68b04efd
commit 674c26d9c7
3 changed files with 19 additions and 12 deletions

View File

@ -1,5 +1,5 @@
Name: msgpack
Version: 0.2.0
Version: 0.2.1
License: BSD3
License-File: LICENSE
Author: Hideyuki Tanaka

View File

@ -33,9 +33,13 @@ 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
bs <- BS.hGet h 1
if BS.length bs > 0
then do return $ Just bs
else do
hClose h
return Nothing

View File

@ -115,19 +115,22 @@ 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
unpackFrom f m = do