@@ -20,15 +20,18 @@ module Streamly.Internal.Data.Binary.Decode
20 , word32le
20 , word32le
21 , word64be
21 , word64be
22 , word64le
22 , word64le
26import Control.Monad.Catch (MonadCatch, throwM)
27import Control.Monad.Catch (MonadCatch, throwM)
28+import Control.Monad.IO.Class (MonadIO)
27import Data.Bits ((.|.), unsafeShiftL)
29import Data.Bits ((.|.), unsafeShiftL)
28import Data.Word (Word8, Word16, Word32, Word64)
30import Data.Word (Word8, Word16, Word32, Word64)
29import Streamly.Internal.Data.Parser (Parser)
31import Streamly.Internal.Data.Parser (Parser)
30import Streamly.Internal.Data.Strict (Maybe'(..), Tuple' (..))
32import Streamly.Internal.Data.Strict (Maybe'(..), Tuple' (..))
34+import qualified Streamly.Internal.Memory.Array as A
32import qualified Streamly.Internal.Data.Parser as PR
35import qualified Streamly.Internal.Data.Parser as PR
33import qualified Streamly.Internal.Data.Parser.ParserD as PRD
36import qualified Streamly.Internal.Data.Parser.ParserD as PRD
34import qualified Streamly.Internal.Data.Parser.ParserK.Types as PRK
37import qualified Streamly.Internal.Data.Parser.ParserK.Types as PRK
@@ -259,3 +262,16 @@ word64leD = PRD.Parser step initial extract
259{-# INLINE word64le #-}
262{-# INLINE word64le #-}
260word64le :: MonadCatch m => Parser m Word8 Word64
263word64le :: MonadCatch m => Parser m Word8 Word64
261word64le = PRK.toParserK word64leD
264word64le = PRK.toParserK word64leD
266+-------------------------------------------------------------------------------
268+-------------------------------------------------------------------------------
270+-- | Parse eight bytes as a 'Word64' in the host byte order.
274+{-# INLINE word64host #-}
275+word64host :: (MonadIO m, MonadCatch m) => Parser m Word8 Word64
277+ fmap (flip A.unsafeIndex 0 . A.unsafeCast) $ PR.take 8 (A.writeN 8)