main :: IO ()
main = defaultMain $
  testGroup "Tests"
    [ testGroup "Arity 1"
      [ testProperty "Idempotence" $
        idempotent (* (0 :: Int))

      , testProperty "Idempotence" $
        (/=0) &> not . idempotent (* (2 :: Int))

      , testProperty "Idempotence" $
        idempotent (abs :: Double -> Double)

      , testProperty "Idempotence" $
        idempotent (signum :: Int -> Int)

      , testProperty "Idempotence" $
        ((*) :: Int -> Int -> Int) `distributesOver` (+)

      , testProperty "Idempotence" $
        (*) `distributesOver` ((+) :: Int -> Int -> Int)
      ]
    ]
main :: IO ()
main = defaultMain $
  testGroup "Tests"
    [ testGroup "Arity 1"
      [ testProperty "Idempotence" $
        idempotent (* (0 :: Int))

      , testProperty "Idempotence" $
        (/=0) &> not . idempotent (* (2 :: Int))

      , testProperty "Idempotence" $
        idempotent (abs :: Double -> Double)

      , testProperty "Idempotence" $
        idempotent (signum :: Int -> Int)

      , testProperty "Idempotence" $
        ((*) :: Int -> Int -> Int) `distributesOver` (+)

      , testProperty "Idempotence" $
        (*) `distributesOver` ((+) :: Int -> Int -> Int)
      ]
    ]
main = defaultMain $
  testGroup "Tests"
    [ testGroup "Arity 1"
      [ testProperty "Idempotence" $
        idempotent (* (0 :: Int))

      , testProperty "Idempotence" $
        (/=0) &> not . idempotent (* (2 :: Int))

      , testProperty "Idempotence" $
        idempotent (abs :: Double -> Double)

      , testProperty "Idempotence" $
        idempotent (signum :: Int -> Int)

      , testProperty "Idempotence" $
        ((*) :: Int -> Int -> Int) `distributesOver` (+)

      , testProperty "Idempotence" $
        (*) `distributesOver` ((+) :: Int -> Int -> Int)
      ]
    ]