{-# LANGUAGE BangPatterns
           , UnboxedTuples #-}

{- | Functions for parsing fixed-width human-readable numbers.
 -}

module Parser.Lathe.Numeric.FixedWidth
  ( int8HexFixed
  , int16HexFixed
  , int32HexFixed
  , int64HexFixed
  , word8HexFixed
  , word16HexFixed
  , word32HexFixed
  , word64HexFixed
  , floatHexFixed
  , doubleHexFixed
  ) where

import           Parser.Lathe.Internal
import           Parser.Lathe.Numeric.FixedWidth.Internal

import           Data.Int
import           Data.Word



{-# INLINE int8HexFixed #-}
-- | Consume 2 hexadecimal digits into an 'Int8'.
int8HexFixed
  :: e             -- ^ Malformed.
  -> e             -- ^ Reached end.
  -> Parser e Int8
int8HexFixed :: forall e. e -> e -> Parser e Int8
int8HexFixed e
e = Int -> (ByteString -> (# Res e Int8 #)) -> e -> Parser e Int8
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
2 (e -> ByteString -> (# Res e Int8 #)
forall e. e -> ByteString -> (# Res e Int8 #)
i8HexFixed e
e)

{-# INLINE word8HexFixed #-}
-- | Consume 2 hexadecimal digits into a 'Word8'.
word8HexFixed
  :: e              -- ^ Malformed.
  -> e              -- ^ Reached end.
  -> Parser e Word8
word8HexFixed :: forall e. e -> e -> Parser e Word8
word8HexFixed e
e = Int -> (ByteString -> (# Res e Word8 #)) -> e -> Parser e Word8
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
2 (e -> ByteString -> (# Res e Word8 #)
forall e. e -> ByteString -> (# Res e Word8 #)
w8HexFixed e
e)



{-# INLINE int16HexFixed #-}
-- | Consume 4 hexadecimal digits into an 'Int16'.
int16HexFixed
  :: e              -- ^ Malformed.
  -> e              -- ^ Reached end.
  -> Parser e Int16
int16HexFixed :: forall e. e -> e -> Parser e Int16
int16HexFixed e
e = Int -> (ByteString -> (# Res e Int16 #)) -> e -> Parser e Int16
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
4 (e -> ByteString -> (# Res e Int16 #)
forall e. e -> ByteString -> (# Res e Int16 #)
i16HexFixed e
e)

{-# INLINE word16HexFixed #-}
-- | Consume 4 hexadecimal digits into a 'Word16'.
word16HexFixed
  :: e              -- ^ Malformed.
  -> e              -- ^ Reached end.
  -> Parser e Word16
word16HexFixed :: forall e. e -> e -> Parser e Word16
word16HexFixed e
e = Int -> (ByteString -> (# Res e Word16 #)) -> e -> Parser e Word16
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
4 (e -> ByteString -> (# Res e Word16 #)
forall e. e -> ByteString -> (# Res e Word16 #)
w16HexFixed e
e)



{-# INLINE int32HexFixed #-}
-- | Consume 8 hexadecimal digits into an 'Int32'.
int32HexFixed
  :: e              -- ^ Malformed.
  -> e              -- ^ Reached end.
  -> Parser e Int32
int32HexFixed :: forall e. e -> e -> Parser e Int32
int32HexFixed e
e = Int -> (ByteString -> (# Res e Int32 #)) -> e -> Parser e Int32
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
8 (e -> ByteString -> (# Res e Int32 #)
forall e. e -> ByteString -> (# Res e Int32 #)
i32HexFixed e
e)

{-# INLINE word32HexFixed #-}
-- | Consume 8 hexadecimal digits into a 'Word32'.
word32HexFixed
  :: e               -- ^ Malformed.
  -> e               -- ^ Reached end.
  -> Parser e Word32
word32HexFixed :: forall e. e -> e -> Parser e Word32
word32HexFixed e
e = Int -> (ByteString -> (# Res e Word32 #)) -> e -> Parser e Word32
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
8 (e -> ByteString -> (# Res e Word32 #)
forall e. e -> ByteString -> (# Res e Word32 #)
w32HexFixed e
e)

{-# INLINE floatHexFixed #-}
-- | Consume 8 hexadecimal digits into a 'Float'.
floatHexFixed
  :: e              -- ^ Malformed.
  -> e              -- ^ Reached end.
  -> Parser e Float
floatHexFixed :: forall e. e -> e -> Parser e Float
floatHexFixed e
e = Int -> (ByteString -> (# Res e Float #)) -> e -> Parser e Float
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
8 (e -> ByteString -> (# Res e Float #)
forall e. e -> ByteString -> (# Res e Float #)
f32HexFixed e
e)



{-# INLINE int64HexFixed #-}
-- | Consume 16 hexadecimal digits into an 'Int64'.
int64HexFixed
  :: e              -- ^ Malformed.
  -> e              -- ^ Reached end.
  -> Parser e Int64
int64HexFixed :: forall e. e -> e -> Parser e Int64
int64HexFixed e
e = Int -> (ByteString -> (# Res e Int64 #)) -> e -> Parser e Int64
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
16 (e -> ByteString -> (# Res e Int64 #)
forall e. e -> ByteString -> (# Res e Int64 #)
i64HexFixed e
e)

{-# INLINE word64HexFixed #-}
-- | Consume 16 hexadecimal digits into a 'Word64'.
word64HexFixed
  :: e               -- ^ Malformed.
  -> e               -- ^ Reached end.
  -> Parser e Word64
word64HexFixed :: forall e. e -> e -> Parser e Word64
word64HexFixed e
e = Int -> (ByteString -> (# Res e Word64 #)) -> e -> Parser e Word64
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
16 (e -> ByteString -> (# Res e Word64 #)
forall e. e -> ByteString -> (# Res e Word64 #)
w64HexFixed e
e)

{-# INLINE doubleHexFixed #-}
-- | Consume 16 hexadecimal digits into a 'Double'.
doubleHexFixed
  :: e               -- ^ Malformed.
  -> e               -- ^ Reached end.
  -> Parser e Double
doubleHexFixed :: forall e. e -> e -> Parser e Double
doubleHexFixed e
e = Int -> (ByteString -> (# Res e Double #)) -> e -> Parser e Double
forall e a. Int -> (ByteString -> (# Res e a #)) -> e -> Parser e a
unsafeRead Int
16 (e -> ByteString -> (# Res e Double #)
forall e. e -> ByteString -> (# Res e Double #)
f64HexFixed e
e)