{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE AllowAmbiguousTypes #-} module Common ( module X , roundtrip , roundtripArray , roundtripArraySpec , roundtripArraysSpec ) where import Test.Hspec as X import Test.Hspec.QuickCheck as X import Test.QuickCheck as X import Data.Persist as X import Massiv.Persist as X import Data.Typeable import Data.Massiv.Array import Test.Massiv.Core roundtrip :: (Eq a, Show a, Persist a) => a -> Property roundtrip val = either error id (decode (encode val)) === val roundtripArray :: forall r ix e. ( Mutable r e , Index ix , Persist e , Persist (Array r ix e) , Eq (Array r ix e) , Show (Array r ix e) ) => Array r ix e -> Property roundtripArray arr = expectProp $ do let arr'' = either error id (runGet getArray (runPut (putArray arr))) getComp arr'' `shouldBe` getComp arr arr'' `shouldBe` arr let arr' = either error id (decode (encode arr)) getComp arr' `shouldBe` getComp arr arr' `shouldBe` arr roundtripArraySpec :: forall r ix e. ( Eq (Array r ix e) , Show (Array r ix e) , Typeable e , Arbitrary ix , Load r ix e , Mutable r e , Arbitrary e , Persist e , Persist (Array r ix e) ) => Spec roundtripArraySpec = prop (showsType @(Array r ix e) "") $ roundtripArray @r @ix @e roundtripArraysSpec :: forall r e. ( Eq (Array r Ix1 e) , Show (Array r Ix1 e) , Persist (Array r Ix1 e) , Load r Ix1 e , Eq (Array r Ix2 e) , Show (Array r Ix2 e) , Persist (Array r Ix2 e) , Load r Ix2 e , Eq (Array r Ix3 e) , Show (Array r Ix3 e) , Persist (Array r Ix3 e) , Load r Ix3 e , Eq (Array r Ix4 e) , Show (Array r Ix4 e) , Load r Ix4 e , Persist (Array r Ix4 e) , Eq (Array r Ix5 e) , Show (Array r Ix5 e) , Persist (Array r Ix5 e) , Load r Ix5 e , Typeable e , Mutable r e , Arbitrary e , Persist e ) => Spec roundtripArraysSpec = describe (showsType @e "") $ do roundtripArraySpec @r @Ix1 @e roundtripArraySpec @r @Ix2 @e roundtripArraySpec @r @Ix3 @e roundtripArraySpec @r @Ix4 @e roundtripArraySpec @r @Ix5 @e