content: {-# LANGUAGE TypeApplications #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  module Main where
  
  import           Control.Monad
  
  import           Data.Proxy
  import           Spec                    (spec)
  import           Test.Hspec              (hspec)
  import           Test.QuickCheck
  import           Test.QuickCheck.Classes
  
  import qualified ArrayFire               as A
  import           ArrayFire               (Array)
  
  import           System.IO.Unsafe
  
  instance (A.AFType a, Arbitrary a) => Arbitrary (Array a) where
    arbitrary = pure $ unsafePerformIO (A.randu [2,2])
  
  main :: IO ()
  main = do
  --  checks (Proxy :: Proxy (A.Array (A.Complex Float)))
  --  checks (Proxy :: Proxy (A.Array (A.Complex Double)))
  --  checks (Proxy :: Proxy (A.Array Double))
  --  checks (Proxy :: Proxy (A.Array Float))
  --  checks (Proxy :: Proxy (A.Array Double))
  --  checks (Proxy :: Proxy (A.Array A.Int16))
  --  checks (Proxy :: Proxy (A.Array A.Int32))
    -- checks (Proxy :: Proxy (A.Array A.CBool))
    -- checks (Proxy :: Proxy (A.Array Word))
    -- checks (Proxy :: Proxy (A.Array A.Word8))
    -- checks (Proxy :: Proxy (A.Array A.Word16))
    -- checks (Proxy :: Proxy (A.Array A.Word32))
  --  lawsCheck $ semigroupLaws (Proxy :: Proxy (A.Array Double))
  --  lawsCheck $ semigroupLaws (Proxy :: Proxy (A.Array Float))
    hspec spec
  
  checks proxy = do
    lawsCheck (numLaws proxy)
    lawsCheck (eqLaws proxy)
    lawsCheck (ordLaws proxy)
  --  lawsCheck (semigroupLaws proxy)
  