packages feed

apply-unordered-1.0: test/Spec.hs

{-# OPTIONS_GHC -fdefer-type-errors -Wno-deferred-type-errors #-}
{-# OPTIONS_GHC -fplugin=Control.Apply.Unordered.Plugin #-}

module Main where

import Control.Apply.Positional
import Control.Apply.Unordered
import Data.Proxy
import GHC.TypeLits
import Test.Hspec
import Test.ShouldNotTypecheck (shouldNotTypecheck)

replicateChar :: Int -> Char -> String
replicateChar = replicate

main :: IO ()
main = hspec $ do
  describe "Positional application" $ do
    it "handles simple functions" $
      applyN @1 replicateChar 'c' 3 `shouldBe` "ccc"
    it "handles polymorphic functions" $
      applyN @1 div 2 4 `shouldBe` 2
    it "yields type error for out of bounds nats" $
      shouldNotTypecheck (applyN @2 replicateChar 'c' 3 :: String)
  describe "Unordered apply via plugin" $ do
    it "Can match types of a polymorphic function" $
      (replicate ? 'c' ? (3 :: Int)) `shouldBe` "ccc"