module RIO.Vector.Storable.Unsafe
  (
  -- * Accessors
  -- ** Indexing
    Data.Vector.Storable.unsafeIndex
  , Data.Vector.Storable.unsafeHead
  , Data.Vector.Storable.unsafeLast

  -- ** Monadic indexing
  , Data.Vector.Storable.unsafeIndexM
  , Data.Vector.Storable.unsafeHeadM
  , Data.Vector.Storable.unsafeLastM

  -- ** Extracting subvectors
  , Data.Vector.Storable.unsafeSlice
  , Data.Vector.Storable.unsafeInit
  , Data.Vector.Storable.unsafeTail
  , Data.Vector.Storable.unsafeTake
  , Data.Vector.Storable.unsafeDrop

  -- * Modifying vectors
  -- ** Bulk updates
  , Data.Vector.Storable.unsafeUpd
  , Data.Vector.Storable.unsafeUpdate_

  -- ** Accumulations
  , Data.Vector.Storable.unsafeAccum
  , Data.Vector.Storable.unsafeAccumulate_

  -- ** Permutations
  , Data.Vector.Storable.unsafeBackpermute

  -- * Conversions
  -- ** Mutable vectors
  , Data.Vector.Storable.unsafeFreeze
  , Data.Vector.Storable.unsafeThaw
  , Data.Vector.Storable.unsafeCopy

  -- * Raw pointers
  , Data.Vector.Storable.unsafeFromForeignPtr
  , Data.Vector.Storable.unsafeFromForeignPtr0
  , Data.Vector.Storable.unsafeToForeignPtr
  , Data.Vector.Storable.unsafeToForeignPtr0
  , unsafeWith
  ) where

import Data.Vector.Storable(Storable, Vector)
import qualified Data.Vector.Storable
import Foreign.Ptr(Ptr)
import UnliftIO

-- | Lifted version of 'Data.Vector.Storable.unsafeWith'
unsafeWith :: (MonadUnliftIO m, Storable a) => Vector a -> (Ptr a -> m b) -> m b
unsafeWith vec action = withRunInIO $ \unlifter -> Data.Vector.Storable.unsafeWith vec (unlifter . action)