diff options
Diffstat (limited to 'Data')
| -rw-r--r-- | Data/FastQ.hs | 38 | 
1 files changed, 21 insertions, 17 deletions
| diff --git a/Data/FastQ.hs b/Data/FastQ.hs index 158db3a..940c875 100644 --- a/Data/FastQ.hs +++ b/Data/FastQ.hs @@ -10,12 +10,10 @@ module Data.FastQ where  import Control.Monad  import Control.Monad.IO.Class (MonadIO, liftIO) -import Data.Bifunctor (bimap)  import Data.ByteString (ByteString)  import qualified Data.ByteString as B  import qualified Data.ByteString.Char8 as BC -import qualified Data.ByteString.Lazy as BSL -import qualified Data.ByteString.Lazy.Internal as BSL +import Data.ByteString.Lazy.Internal (defaultChunkSize)  import Data.Function  import Data.Streaming.Zlib  import Data.Word (Word8) @@ -43,6 +41,7 @@ makeLenses ''Read  type ReadPair = (Read, Read) +gzipWindow :: WindowBits  gzipWindow = WindowBits 31  parse :: MonadIO m => FilePath -> FilePath -> Stream m ReadPair @@ -61,22 +60,27 @@ parse l r =            pure $ Just (h, i, Nothing)          step Nothing = pure Stop          step (Just (h, i, Nothing)) = liftIO $ do -          chunk <- B.hGet h BSL.defaultChunkSize -          if chunk == B.empty +          complete <- isCompleteInflate i +          (frag, unused, i) <- +            if complete +              then do +                f <- finishInflate i +                u <- getUnusedInflate i +                (f,u,) <$> initInflate gzipWindow +              else pure ("", "", i) +          if unused == ""              then do -              hClose h -              str <- finishInflate i -              pure $ Yield (SB.toArray str) Nothing +              chunk <- B.hGet h defaultChunkSize +              if chunk == B.empty +                then do +                  hClose h +                  str <- finishInflate i +                  pure $ Yield (SB.toArray $ frag <> str) Nothing +                else do +                  popper <- feedInflate i $ chunk +                  pure $ Yield (SB.toArray frag) (Just (h, i, Just popper))              else do -              complete <- isCompleteInflate i -              (frag, unused, i) <- -                if complete -                  then do -                    f <- finishInflate i -                    u <- getUnusedInflate i -                    (f,u,) <$> initInflate gzipWindow -                  else pure ("", "", i) -              popper <- feedInflate i $ unused <> chunk +              popper <- feedInflate i $ unused                pure $ Yield (SB.toArray frag) (Just (h, i, Just popper))          step (Just (h, i, Just popper)) = liftIO $ do            popper >>= \case | 
