module Data.Repa.Convert.Internal.Packer
( Packer (..)
, unsafeRunPacker)
where
import Data.Word
import Data.IORef
import GHC.Exts
import qualified Foreign.Ptr as F
data Packer
= Packer
{
Packer -> Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
fromPacker
:: Addr#
-> IO ()
-> (Addr# -> IO ())
-> IO ()
}
instance Semigroup Packer where
<> :: Packer -> Packer -> Packer
(<>) = Packer -> Packer -> Packer
forall a. Monoid a => a -> a -> a
mappend
instance Monoid Packer where
mempty :: Packer
mempty
= (Addr# -> IO () -> (Addr# -> IO ()) -> IO ()) -> Packer
Packer ((Addr# -> IO () -> (Addr# -> IO ()) -> IO ()) -> Packer)
-> (Addr# -> IO () -> (Addr# -> IO ()) -> IO ()) -> Packer
forall a b. (a -> b) -> a -> b
$ \Addr#
buf IO ()
_fail Addr# -> IO ()
k -> Addr# -> IO ()
k Addr#
buf
{-# INLINE mempty #-}
mappend :: Packer -> Packer -> Packer
mappend (Packer Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
fa) (Packer Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
fb)
= (Addr# -> IO () -> (Addr# -> IO ()) -> IO ()) -> Packer
Packer ((Addr# -> IO () -> (Addr# -> IO ()) -> IO ()) -> Packer)
-> (Addr# -> IO () -> (Addr# -> IO ()) -> IO ()) -> Packer
forall a b. (a -> b) -> a -> b
$ \Addr#
buf0 IO ()
fails Addr# -> IO ()
k -> Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
fa Addr#
buf0 IO ()
fails (\Addr#
buf1 -> Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
fb Addr#
buf1 IO ()
fails Addr# -> IO ()
k)
{-# INLINE mappend #-}
unsafeRunPacker
:: Packer
-> F.Ptr Word8
-> IO (Maybe (F.Ptr Word8))
unsafeRunPacker :: Packer -> Ptr Word8 -> IO (Maybe (Ptr Word8))
unsafeRunPacker (Packer Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
make) (Ptr Addr#
addr)
= do IORef (Maybe (Ptr Word8))
ref <- Maybe (Ptr Word8) -> IO (IORef (Maybe (Ptr Word8)))
forall a. a -> IO (IORef a)
newIORef Maybe (Ptr Word8)
forall a. Maybe a
Nothing
Addr# -> IO () -> (Addr# -> IO ()) -> IO ()
make Addr#
addr
(() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
(\Addr#
addr' -> IORef (Maybe (Ptr Word8)) -> Maybe (Ptr Word8) -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef (Maybe (Ptr Word8))
ref (Ptr Word8 -> Maybe (Ptr Word8)
forall a. a -> Maybe a
Just (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
addr')))
IORef (Maybe (Ptr Word8)) -> IO (Maybe (Ptr Word8))
forall a. IORef a -> IO a
readIORef IORef (Maybe (Ptr Word8))
ref
{-# INLINE unsafeRunPacker #-}