module Data.RangeMin.Common.Vector.Utils (write, read, new, newWith, drop, slice, sliceM, unsafeFreeze, minIndex,
streamM, (!), getRow, G.Vector, GM.MVector, G.Mutable, G.stream) where
import Control.Monad.Primitive
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Generic.Mutable as GM
import qualified Data.Vector.Fusion.Stream as S
import Prelude hiding (read, drop)
unsafeFreeze :: (PrimMonad m, G.Vector v a) => G.Mutable v (PrimState m) a -> m (v a)
unsafeFreeze = G.unsafeFreeze
sliceM :: GM.MVector v a => Int -> Int -> v s a -> v s a
sliceM = GM.unsafeSlice
write :: (PrimMonad m, GM.MVector v a) => v (PrimState m) a -> Int -> a -> m ()
write = GM.unsafeWrite
read :: (PrimMonad m, GM.MVector v a) => v (PrimState m) a -> Int -> m a
read = GM.unsafeRead
new :: (PrimMonad m, GM.MVector v a) => Int -> m (v (PrimState m) a)
new = GM.unsafeNew
newWith :: (PrimMonad m, GM.MVector v a) => Int -> a -> m (v (PrimState m) a)
newWith = GM.unsafeNewWith
drop :: G.Vector v a => Int -> v a -> v a
drop = G.unsafeDrop
slice :: G.Vector v a => Int -> Int -> v a -> v a
slice = G.unsafeSlice
minIndex :: (G.Vector v a, Ord a) => v a -> Int -> Int -> Int
minIndex !xs !i !j
| xs ! i <= xs ! j = i
| otherwise = j
streamM :: (G.Vector v a, Monad m) => v a -> S.MStream m a
streamM = S.liftStream . G.stream
(!) :: G.Vector v a => v a -> Int -> a
(!) = G.unsafeIndex
getRow :: G.Vector v a => Int -> v a -> Int -> Int -> a
getRow !cols !vec !i = (!) row
where !row = drop (i * cols) vec