module Data.Array.Repa.Repr.Vector
( V, Array (..)
, computeVectorS, computeVectorP
, fromListVector
, fromVector
, toVector)
where
import Data.Array.Repa.Shape
import Data.Array.Repa.Base
import Data.Array.Repa.Eval
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM
import Control.Monad
data V
instance Source V a where
data Array V sh a
= AVector !sh !(V.Vector a)
linearIndex (AVector _ vec) ix
= vec V.! ix
{-# INLINE linearIndex #-}
unsafeLinearIndex (AVector _ vec) ix
= vec `V.unsafeIndex` ix
{-# INLINE unsafeLinearIndex #-}
extent (AVector sh _)
= sh
{-# INLINE extent #-}
deepSeqArray (AVector sh vec) x
= sh `deepSeq` vec `seq` x
{-# INLINE deepSeqArray #-}
deriving instance (Show sh, Show e)
=> Show (Array V sh e)
deriving instance (Read sh, Read e)
=> Read (Array V sh e)
instance Target V e where
data MVec V e
= MVector (VM.IOVector e)
newMVec n
= liftM MVector (VM.new n)
{-# INLINE newMVec #-}
unsafeWriteMVec (MVector v) ix
= VM.unsafeWrite v ix
{-# INLINE unsafeWriteMVec #-}
unsafeFreezeMVec sh (MVector mvec)
= do vec <- V.unsafeFreeze mvec
return $ AVector sh vec
{-# INLINE unsafeFreezeMVec #-}
deepSeqMVec !_vec x
= x
{-# INLINE deepSeqMVec #-}
touchMVec _
= return ()
{-# INLINE touchMVec #-}
computeVectorS
:: Load r1 sh e
=> Array r1 sh e -> Array V sh e
computeVectorS = computeS
{-# INLINE computeVectorS #-}
computeVectorP
:: (Load r1 sh e, Monad m)
=> Array r1 sh e -> m (Array V sh e)
computeVectorP = computeP
{-# INLINE computeVectorP #-}
fromListVector :: Shape sh => sh -> [a] -> Array V sh a
fromListVector = fromList
{-# INLINE fromListVector #-}
fromVector :: sh -> V.Vector e -> Array V sh e
fromVector sh vec
= AVector sh vec
{-# INLINE fromVector #-}
toVector :: Array V sh e -> V.Vector e
toVector (AVector _ vec)
= vec
{-# INLINE toVector #-}