-- Tests that instances for non-exported classes / types do not appear in the
-- result of `exportedDeclarations`.
module Main
  ( Const(..)
  , class Foo
  , foo
  , main
  ) where

import Prelude
import Control.Monad.Eff.Console (log)

data Const a b = Const a

class Foo a where
  foo :: a

data NonexportedType = NonexportedType

class NonexportedClass a where
  notExported :: a

-- There are three places that a nonexported type or type class can occur,
-- leading an instance to count as non-exported:
--  * Constraints
--  * The type class itself
--  * The instance types

-- Case 1: constraints
instance nonExportedFoo :: (NonexportedClass a) => Foo a where
  foo = notExported

-- Another instance of case 1:
instance nonExportedFoo2 :: (Foo NonexportedType) => Foo (a -> a) where
  foo = id

-- Case 2: type class
instance nonExportedNonexportedType :: NonexportedClass (Const Int a) where
  notExported = Const 0

-- Case 3: instance types
instance constFoo :: Foo (Const NonexportedType b) where
  foo = Const NonexportedType

main = log "Done"
