packages feed

polysemy-plugin-0.2.0.3: test/BadSpec.hs

{-# LANGUAGE TemplateHaskell #-}

{-# OPTIONS_GHC -fdefer-type-errors -fno-warn-deferred-type-errors #-}

module BadSpec where

import Polysemy
import Polysemy.State
import Test.Hspec
import Test.ShouldNotTypecheck

data KVStore k v m a where
  GetKV :: k -> KVStore k v m (Maybe v)

makeSem ''KVStore

positivePos :: Member (KVStore k v) r => Sem r (Maybe v)
positivePos = do
  getKV "hello"

negativePos :: Member (KVStore String v) r => Sem r (Maybe Bool)
negativePos = do
  getKV "hello"

badState :: Member (State a) r => Sem r ()
badState = put ()


spec :: Spec
spec = do
  describe "incorrectly polymorphic constraint" $ do
    it "should not typecheck in positive position" $ do
      shouldNotTypecheck positivePos
    it "should not typecheck in negative position" $ do
      shouldNotTypecheck negativePos
    it "should not typecheck badly polymorphic State" $ do
      shouldNotTypecheck badState