packages feed

accelerate-examples-0.12.0.0: examples/tests/io/VectorCopy.hs

{-# LANGUAGE TemplateHaskell, TypeFamilies #-}

module VectorCopy where

import Data.Array.Accelerate hiding (fromList)
import Data.Array.Accelerate.Array.Sugar (EltRepr)
import Data.Array.Accelerate.IO

import Data.Vector.Storable

import Foreign

import Test.QuickCheck
import Test.QuickCheck.All
import Test.QuickCheck.Monadic

roundtrip :: ( Arbitrary a
             , Eq a
             , Elt a
             , Storable a
             , BlockPtrs (EltRepr a) ~ ((), Ptr a) )
          => [a] -> Property
roundtrip xs = monadicIO $ do
  let xsv = fromList xs
  xsarr <- run $ fromVectorIO xsv
  xsv'  <- run $ toVectorIO xsarr
  assert (xsv == xsv')

unsaferoundtrip :: ( Arbitrary a
                   , Eq a
                   , Elt a
                   , Storable a
                   , BlockPtrs (EltRepr a) ~ ((), Ptr a) )
                => [a] -> Bool
unsaferoundtrip xs = xsv == (toVector (fromVector xsv))
  where xsv = fromList xs

prop_Int8_roundtrip :: [Int8] -> Property
prop_Int8_roundtrip = roundtrip
prop_Int8_unsaferoundtrip :: [Int8] -> Bool
prop_Int8_unsaferoundtrip = unsaferoundtrip

prop_Int16_roundtrip :: [Int16] -> Property
prop_Int16_roundtrip = roundtrip
prop_Int16_unsaferoundtrip :: [Int16] -> Bool
prop_Int16_unsaferoundtrip = unsaferoundtrip

prop_Int32_roundtrip :: [Int32] -> Property
prop_Int32_roundtrip = roundtrip
prop_Int32_unsaferoundtrip :: [Int32] -> Bool
prop_Int32_unsaferoundtrip = unsaferoundtrip

prop_Int64_roundtrip :: [Int64] -> Property
prop_Int64_roundtrip = roundtrip
prop_Int64_unsaferoundtrip :: [Int64] -> Bool
prop_Int64_unsaferoundtrip = unsaferoundtrip

prop_Int_roundtrip :: [Int] -> Property
prop_Int_roundtrip = roundtrip
prop_Int_unsaferoundtrip :: [Int] -> Bool
prop_Int_unsaferoundtrip = unsaferoundtrip

prop_Float_roundtrip :: [Float] -> Property
prop_Float_roundtrip = roundtrip
prop_Float_unsaferoundtrip :: [Float] -> Bool
prop_Float_unsaferoundtrip = unsaferoundtrip

prop_Double_roundtrip :: [Double] -> Property
prop_Double_roundtrip = roundtrip
prop_Double_unsaferoundtrip :: [Double] -> Bool
prop_Double_unsaferoundtrip = unsaferoundtrip

test :: IO Bool
test = $quickCheckAll