packages feed

massiv-0.1.1.0: tests/Data/Massiv/Array/MutableSpec.hs

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MonoLocalBinds        #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Massiv.Array.MutableSpec (spec) where

import           Data.Massiv.CoreArbitrary as A
import           Data.Proxy
import           Data.Functor.Identity
import           Test.Hspec
import           Test.QuickCheck
import           Test.QuickCheck.Function


prop_MapMapM :: (Show (Array r ix Int), Eq (Array r ix Int), Mutable r ix Int) =>
                r -> Proxy ix -> Fun Int Int -> ArrTiny D ix Int -> Property
prop_MapMapM r _ f (ArrTiny arr) =
  computeAs r (A.map (apply f) arr) === runIdentity (A.mapM r (return . apply f) arr)

prop_iMapiMapM :: (Show (Array r ix Int), Eq (Array r ix Int), Mutable r ix Int) =>
                r -> Proxy ix -> Fun (ix, Int) Int -> ArrTiny D ix Int -> Property
prop_iMapiMapM r _ f (ArrTiny arr) =
  computeAs r (A.imap (curry (apply f)) arr) ===
  runIdentity (A.imapM r (\ix e -> return $ apply f (ix, e)) arr)


generateSpec :: Spec
generateSpec = do
  describe "map == mapM" $ do
    describe "P" $ do
      it "Ix1" $ property $ prop_MapMapM P (Proxy :: Proxy Ix1)
      it "Ix2" $ property $ prop_MapMapM P (Proxy :: Proxy Ix2)
      it "Ix3" $ property $ prop_MapMapM P (Proxy :: Proxy Ix3)
    describe "U" $ do
      it "Ix1" $ property $ prop_MapMapM U (Proxy :: Proxy Ix1)
      it "Ix2" $ property $ prop_MapMapM U (Proxy :: Proxy Ix2)
      it "Ix3" $ property $ prop_MapMapM U (Proxy :: Proxy Ix3)
    describe "S" $ do
      it "Ix1" $ property $ prop_MapMapM S (Proxy :: Proxy Ix1)
      it "Ix2" $ property $ prop_MapMapM S (Proxy :: Proxy Ix2)
      it "Ix3" $ property $ prop_MapMapM S (Proxy :: Proxy Ix3)
    describe "B" $ do
      it "Ix1" $ property $ prop_MapMapM B (Proxy :: Proxy Ix1)
      it "Ix2" $ property $ prop_MapMapM B (Proxy :: Proxy Ix2)
      it "Ix3" $ property $ prop_MapMapM B (Proxy :: Proxy Ix3)
  describe "imap == imapM" $ do
    describe "P" $ do
      it "Ix1" $ property $ prop_iMapiMapM P (Proxy :: Proxy Ix1)
      it "Ix2T" $ property $ prop_iMapiMapM P (Proxy :: Proxy Ix2T)
      it "Ix3T" $ property $ prop_iMapiMapM P (Proxy :: Proxy Ix3T)
    describe "U" $ do
      it "Ix1" $ property $ prop_iMapiMapM U (Proxy :: Proxy Ix1)
      it "Ix2T" $ property $ prop_iMapiMapM U (Proxy :: Proxy Ix2T)
      it "Ix3T" $ property $ prop_iMapiMapM U (Proxy :: Proxy Ix3T)
    describe "S" $ do
      it "Ix1" $ property $ prop_iMapiMapM S (Proxy :: Proxy Ix1)
      it "Ix2T" $ property $ prop_iMapiMapM S (Proxy :: Proxy Ix2T)
      it "Ix3T" $ property $ prop_iMapiMapM S (Proxy :: Proxy Ix3T)
    describe "B" $ do
      it "Ix1" $ property $ prop_iMapiMapM B (Proxy :: Proxy Ix1)
      it "Ix2T" $ property $ prop_iMapiMapM B (Proxy :: Proxy Ix2T)
      it "Ix3T" $ property $ prop_iMapiMapM B (Proxy :: Proxy Ix3T)


spec :: Spec
spec = describe "GenerateM" generateSpec