module Data.Array.Repa.Series.Vector
( Vector
, length
, new
, read
, write
, take
, fromUnboxed
, toUnboxed)
where
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Unboxed.Mutable as UM
import Data.Vector.Unboxed (Unbox)
import System.IO.Unsafe
import GHC.Exts
import Prelude hiding (length, read, take)
data Vector a
= Vector
{ vectorLength :: Int#
, vectorData :: !(UM.IOVector a) }
instance (Unbox a, Show a) => Show (Vector a) where
show vec
= unsafePerformIO
$ do fvec <- U.unsafeFreeze (vectorData vec)
return $ show fvec
length :: Vector a -> Int#
length vec
= vectorLength vec
new :: Unbox a => Int# -> IO (Vector a)
new len
= do vec <- UM.new (I# len)
return $ Vector len vec
read :: Unbox a => Vector a -> Int# -> IO a
read vec ix
= UM.unsafeRead (vectorData vec) (I# ix)
write :: Unbox a => Vector a -> Int# -> a -> IO ()
write vec ix val
= UM.unsafeWrite (vectorData vec) (I# ix) val
take :: Unbox a => Int# -> Vector a -> IO (Vector a)
take len (Vector _ mvec)
= do return $ Vector len $ UM.unsafeTake (I# len) mvec
fromUnboxed :: Unbox a => U.Vector a -> IO (Vector a)
fromUnboxed vec
= do let !(I# len) = U.length vec
mvec <- U.unsafeThaw vec
return $ Vector len mvec
toUnboxed :: Unbox a => Vector a -> IO (U.Vector a)
toUnboxed (Vector _ mvec)
= U.unsafeFreeze mvec