module Ptr.ByteString where

import qualified Data.ByteString.Internal as B
import qualified Ptr.Parse as C
import qualified Ptr.Peek as D
import qualified Ptr.Poking as A
import Ptr.Prelude

{-# INLINE poking #-}
poking :: A.Poking -> B.ByteString
poking :: Poking -> ByteString
poking (A.Poking Int
size Ptr Word8 -> IO ()
population) =
  Int -> (Ptr Word8 -> IO ()) -> ByteString
B.unsafeCreate Int
size Ptr Word8 -> IO ()
population

{-# INLINE parse #-}
parse :: B.ByteString -> C.Parse result -> (Int -> result) -> (Text -> result) -> result
parse :: ByteString
-> Parse result -> (Int -> result) -> (Text -> result) -> result
parse (B.PS ForeignPtr Word8
fp Int
offset Int
length) (C.Parse Int
-> Ptr Word8
-> forall result.
   (Int -> IO result)
   -> (Text -> IO result)
   -> (result -> Int -> Ptr Word8 -> IO result)
   -> IO result
parseIO) Int -> result
eoi Text -> result
error =
  {-# SCC "parse" #-}
  IO result -> result
forall a. IO a -> a
unsafePerformIO (IO result -> result) -> IO result -> result
forall a b. (a -> b) -> a -> b
$
    ForeignPtr Word8 -> (Ptr Word8 -> IO result) -> IO result
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Word8
fp ((Ptr Word8 -> IO result) -> IO result)
-> (Ptr Word8 -> IO result) -> IO result
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
ptr ->
      Int
-> Ptr Word8
-> (Int -> IO result)
-> (Text -> IO result)
-> (result -> Int -> Ptr Word8 -> IO result)
-> IO result
Int
-> Ptr Word8
-> forall result.
   (Int -> IO result)
   -> (Text -> IO result)
   -> (result -> Int -> Ptr Word8 -> IO result)
   -> IO result
parseIO Int
length (Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr Word8
ptr Int
offset) (result -> IO result
forall (m :: * -> *) a. Monad m => a -> m a
return (result -> IO result) -> (Int -> result) -> Int -> IO result
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> result
eoi) (result -> IO result
forall (m :: * -> *) a. Monad m => a -> m a
return (result -> IO result) -> (Text -> result) -> Text -> IO result
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> result
error) (\result
result Int
_ Ptr Word8
_ -> result -> IO result
forall (m :: * -> *) a. Monad m => a -> m a
return result
result)

{-# INLINE peek #-}
peek :: B.ByteString -> D.Peek result -> Maybe result
peek :: ByteString -> Peek result -> Maybe result
peek (B.PS ForeignPtr Word8
fp Int
offset Int
length) (D.Peek Int
amount Ptr Word8 -> IO result
io) =
  {-# SCC "peek" #-}
  if Int
amount Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
length
    then result -> Maybe result
forall a. a -> Maybe a
Just (result -> Maybe result) -> result -> Maybe result
forall a b. (a -> b) -> a -> b
$
      IO result -> result
forall a. IO a -> a
unsafePerformIO (IO result -> result) -> IO result -> result
forall a b. (a -> b) -> a -> b
$
        ForeignPtr Word8 -> (Ptr Word8 -> IO result) -> IO result
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Word8
fp ((Ptr Word8 -> IO result) -> IO result)
-> (Ptr Word8 -> IO result) -> IO result
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
ptr ->
          Ptr Word8 -> IO result
io (Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr Word8
ptr Int
offset)
    else Maybe result
forall a. Maybe a
Nothing