{-# OPTIONS_GHC -fdefer-type-errors -Wno-deferred-type-errors #-}
module Main where
import Control.Apply.Unordered.Mono
import Test.Hspec
import Test.ShouldNotTypecheck (shouldNotTypecheck)
replicateChar :: Int -> Char -> String
replicateChar = replicate
polymorphicReturn :: Int -> Char -> Maybe a
polymorphicReturn _ _ = Nothing
threeArgs :: Int -> Char -> Bool -> String
threeArgs a b c = show (a, b, c)
i3 :: Int
i3 = 3
main :: IO ()
main = hspec $ do
describe "Type directed apply with first match" $ do
it "handles simple parameters (1)" $
(replicateChar ? 'a' ? i3) `shouldBe` "aaa"
it "handles simple parameters (2)" $
(replicateChar ? i3 ? 'a') `shouldBe` "aaa"
it "handles simple ambiguous parameters (1)" $
((||) ? True ? False) `shouldBe` True
it "handles simple ambiguous parameters (2)" $
((||) ? False ? False) `shouldBe` False
it "errors when there is no match" $
shouldNotTypecheck ((||) ? "test")
it "doesn't handle any parameter polymorphism" $
shouldNotTypecheck (replicate ? 3 $ 'a' :: String)
it "does handle result polymorphism" $
(polymorphicReturn ? i3 $ 'a') `shouldBe` Nothing
describe "Type directed apply with unique match" $ do
it "handles simple parameters (1)" $
(replicateChar ?! 'a' ?! i3) `shouldBe` "aaa"
it "handles simple parameters (2)" $
(replicateChar ?! i3 ?! 'a') `shouldBe` "aaa"
it "checks for ambiguity" $
shouldNotTypecheck ((||) ?! True ?! False :: Bool)
it "errors when there is no match" $
shouldNotTypecheck (replicateChar ? "test")
describe "Argument reordering" $ do
it "can re-order a 3 argument function (1)" $
reorderArgs threeArgs 'a' i3 True `shouldBe` "(3,'a',True)"
it "can re-order a 3 argument function (2)" $
reorderArgs threeArgs False 'b' i3 `shouldBe` "(3,'b',False)"