{-# LANGUAGE FlexibleContexts #-}
module Data.Massiv.Vector.Unsafe
(
unsafeHead
, unsafeLast
, unsafeIndexM
, unsafeHeadM
, unsafeLastM
, unsafeInit
, unsafeTail
, unsafeTake
, unsafeDrop
) where
import Data.Coerce
import Data.Massiv.Core.Common
unsafeHead :: Source r Ix1 e => Vector r e -> e
unsafeHead = (`unsafeLinearIndex` 0)
{-# INLINE unsafeHead #-}
unsafeLast :: Source r Ix1 e => Vector r e -> e
unsafeLast v = unsafeLinearIndex v (max 0 (unSz (size v) - 1))
{-# INLINE unsafeLast #-}
unsafeIndexM :: (Source r Ix1 e, Monad m) => Vector r e -> Ix1 -> m e
unsafeIndexM v i = pure $! unsafeLinearIndex v i
{-# INLINE unsafeIndexM #-}
unsafeHeadM :: Monad m => Source r Ix1 e => Vector r e -> m e
unsafeHeadM v = pure $! unsafeHead v
{-# INLINE unsafeHeadM #-}
unsafeLastM :: Monad m => Source r Ix1 e => Vector r e -> m e
unsafeLastM v = pure $! unsafeLast v
{-# INLINE unsafeLastM #-}
unsafeInit :: Source r Ix1 e => Vector r e -> Vector r e
unsafeInit v = unsafeLinearSlice 0 (SafeSz (coerce (size v) - 1)) v
{-# INLINE unsafeInit #-}
unsafeTail :: Source r Ix1 e => Vector r e -> Vector r e
unsafeTail = unsafeDrop 1
{-# INLINE unsafeTail #-}
unsafeTake :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e
unsafeTake = unsafeLinearSlice 0
{-# INLINE unsafeTake #-}
unsafeDrop :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e
unsafeDrop (Sz d) v = unsafeLinearSlice d (SafeSz (coerce (size v) - d)) v
{-# INLINE unsafeDrop #-}