diff --git a/vector/src/Data/Vector/Primitive.hs b/vector/src/Data/Vector/Primitive.hs index 40033732..d6a06c62 100644 --- a/vector/src/Data/Vector/Primitive.hs +++ b/vector/src/Data/Vector/Primitive.hs @@ -163,8 +163,10 @@ module Data.Vector.Primitive ( ) where import Control.Applicative (Applicative) +import Data.Coerce (Coercible) import qualified Data.Vector.Generic as G -import Data.Vector.Primitive.Unsafe (Vector,unsafeCoerceVector,unsafeCast) +import Data.Vector.Primitive.Unsafe (Vector) +import qualified Data.Vector.Primitive.Unsafe as U import Data.Vector.Primitive.Mutable (MVector) import Data.Vector.Primitive.Pattern @@ -172,6 +174,7 @@ import Data.Primitive ( Prim ) import Control.Monad.ST ( ST ) import Control.Monad.Primitive +import GHC.Stack (HasCallStack) import Prelude ( Eq, Ord, Num, Enum, Monoid, Traversable, Monad, Bool, Ordering(..), Int, Maybe, Either @@ -1904,5 +1907,17 @@ copy :: (Prim a, PrimMonad m) => MVector (PrimState m) a -> Vector a -> m () {-# INLINE copy #-} copy = G.copy +-- | Unsafe functions are defined in "Data.Vector.Primitive.Unsafe" +unsafeCoerceVector :: Coercible a b => Vector a -> Vector b +unsafeCoerceVector = U.unsafeCoerceVector +{-# DEPRECATED unsafeCoerceVector "Use 'Data.Vector.Primitive.Unsafe.unsafeCoerceVector'" #-} + +-- | Unsafe functions are defined in "Data.Vector.Primitive.Unsafe" +unsafeCast :: forall a b. (HasCallStack, Prim a, Prim b) => Vector a -> Vector b +unsafeCast = U.unsafeCast +{-# INLINE unsafeCast #-} +{-# DEPRECATED unsafeCast "Use 'Data.Vector.Primitive.Unsafe.unsafeCast'" #-} + + -- $setup -- >>> import Prelude (($), min, even, max, succ, id, Ord(..), Num(..), undefined) diff --git a/vector/src/Data/Vector/Primitive/Mutable.hs b/vector/src/Data/Vector/Primitive/Mutable.hs index 515bd30e..fce73d58 100644 --- a/vector/src/Data/Vector/Primitive/Mutable.hs +++ b/vector/src/Data/Vector/Primitive/Mutable.hs @@ -69,13 +69,15 @@ module Data.Vector.Primitive.Mutable ( Prim, PrimMonad, PrimState, RealWorld ) where +import Data.Coerce (Coercible) import qualified Data.Vector.Generic.Mutable as G import Data.Primitive ( Prim ) -import Data.Vector.Primitive.Mutable.Unsafe - (MVector,unsafeCoerceMVector,unsafeCast) +import Data.Vector.Primitive.Mutable.Unsafe (MVector) +import qualified Data.Vector.Primitive.Mutable.Unsafe as U import Data.Vector.Primitive.Pattern import Control.Monad.Primitive +import GHC.Stack (HasCallStack) import Prelude ( Ord, Bool, Int, Maybe, Ordering(..) ) #include "vector.h" @@ -666,5 +668,16 @@ ifoldrM' :: (PrimMonad m, Prim a) => (Int -> a -> b -> m b) -> b -> MVector (Pri {-# INLINE ifoldrM' #-} ifoldrM' = G.ifoldrM' +-- | Unsafe functions are defined in "Data.Vector.Primitive.Mutable.Unsafe" +unsafeCoerceMVector :: Coercible a b => MVector s a -> MVector s b +unsafeCoerceMVector = U.unsafeCoerceMVector +{-# DEPRECATED unsafeCoerceMVector "Use 'Data.Vector.Primitive.Mutable.Unsafe.unsafeCoerceMVector'" #-} + +-- | Unsafe functions are defined in "Data.Vector.Primitive.Mutable.Unsafe" +unsafeCast :: forall a b s. (HasCallStack, Prim a, Prim b) => MVector s a -> MVector s b +unsafeCast = U.unsafeCast +{-# INLINE unsafeCast #-} +{-# DEPRECATED unsafeCast "Use 'Data.Vector.Primitive.Mutable.Unsafe.unsafeCast'" #-} + -- $setup -- >>> import Prelude (($), Num(..))