on master help sign in
Add word64host
6b85628Harendra Kumar
src/Streamly/Internal/Data/Binary/Decode.hs+16
@@ -20,15 +20,18 @@ module Streamly.Internal.Data.Binary.Decode
20 , word32le
20 , word32le
21 , word64be
21 , word64be
22 , word64le
22 , word64le
23+ , word64host
23 )
24 )
24where
25where
25
26
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' (..))
31
33
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
265+
266+-------------------------------------------------------------------------------
267+-- Host byte order
268+-------------------------------------------------------------------------------
269+
270+-- | Parse eight bytes as a 'Word64' in the host byte order.
271+--
272+-- /Internal/
273+--
274+{-# INLINE word64host #-}
275+word64host :: (MonadIO m, MonadCatch m) => Parser m Word8 Word64
276+word64host =
277+ fmap (flip A.unsafeIndex 0 . A.unsafeCast) $ PR.take 8 (A.writeN 8)