{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Array.Accelerate.IO.Data.Vector.Generic
where
import Data.Array.Accelerate.Array.Sugar as A
import Data.Array.Accelerate.Array.Data as A
import Data.Array.Accelerate.IO.Data.Vector.Generic.Mutable as A
import qualified Data.Vector.Generic as V
import qualified Data.Vector.Generic.Mutable as M
type instance V.Mutable Vector = MVector
instance Elt e => V.Vector Vector e where
{-# INLINE basicUnsafeFreeze #-}
{-# INLINE basicUnsafeThaw #-}
{-# INLINE basicLength #-}
{-# INLINE basicUnsafeSlice #-}
{-# INLINE basicUnsafeIndexM #-}
{-# INLINE basicUnsafeCopy #-}
basicUnsafeFreeze (MArray sh mad) = return (Array sh mad)
basicUnsafeThaw (Array sh ad) = return (MArray sh ad)
basicLength (Array ((),n) _) = n
basicUnsafeSlice i n (Array sh ad) =
case M.basicUnsafeSlice i n (MArray sh ad :: MVector s e) of
MArray sh' mad' -> Array sh' mad'
basicUnsafeIndexM (Array _ ad) i = return $ toElt (unsafeIndexArrayData ad i)
basicUnsafeCopy dst (Array sh ad) = M.basicUnsafeCopy dst (MArray sh ad)