packages feed

massiv-test-1.1.0.0: src/Test/Massiv/Array/Load.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

module Test.Massiv.Array.Load (loadSpec) where

import Data.Massiv.Array as A
import Test.Massiv.Core.Common ()
import Test.Massiv.Utils as T

prop_replicate
  :: forall r ix e
   . ( Eq e
     , Show e
     , Load r ix e
     , Ragged L ix e
     )
  => Comp
  -> Sz ix
  -> e
  -> Property
prop_replicate comp sz e = propIO $ do
  computeAs B (A.replicate @r comp sz e)
    `shouldBe` computeAs B (makeArrayLinear @r comp sz (const e))

prop_makeArray
  :: forall r ix e
   . ( Eq e
     , Show e
     , Load r ix e
     , Ragged L ix e
     )
  => Comp
  -> Sz ix
  -> Fun ix e
  -> Property
prop_makeArray comp sz f = propIO $ do
  let barr = makeArray @B comp sz (applyFun f)
  computeAs B (makeArray @r comp sz (applyFun f)) `shouldBe` barr
  computeAs B (makeArrayLinear @r comp sz (applyFun f . fromLinearIndex sz)) `shouldBe` barr

loadSpec
  :: forall r ix e
   . ( Eq e
     , Show e
     , Typeable e
     , Arbitrary e
     , Function ix
     , Arbitrary ix
     , CoArbitrary ix
     , Ragged L ix e
     , Load r ix e
     )
  => Spec
loadSpec = do
  describe (("LoadSpec " ++) . showsArrayType @r @ix @e $ "") $ do
    prop "replicate" $ prop_replicate @r @ix @e
    prop "makeArray" $ prop_makeArray @r @ix @e