{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

{-# OPTIONS_GHC -fplugin=IfSat.Plugin #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module M2 where

import M1

--------------------------------------------------------------------------------


instance Show ( Bool -> Bool ) where
  show :: (Bool -> Bool) -> String
show Bool -> Bool
f = [Bool] -> String
forall a. Show a => a -> String
show [ Bool -> Bool
f Bool
False, Bool -> Bool
f Bool
True ]

test2 :: ( a -> a ) -> String
test2 :: forall a. (a -> a) -> String
test2 a -> a
fun = (a -> a) -> String
forall a. IfSat (Show (a -> a)) => (a -> a) -> String
showFun a -> a
fun

test3 :: ( Bool -> Bool ) -> String
test3 :: (Bool -> Bool) -> String
test3 Bool -> Bool
fun = (Bool -> Bool) -> String
forall a. IfSat (Show (a -> a)) => (a -> a) -> String
showFun Bool -> Bool
fun

test :: String
test :: String
test =
  [String] -> String
unlines
    [ (Bool -> Bool) -> String
test1 Bool -> Bool
not
    , (Bool -> Bool) -> String
forall a. (a -> a) -> String
test2 Bool -> Bool
not
    , (Bool -> Bool) -> String
test3 Bool -> Bool
not
    , (Bool -> Bool) -> String
forall a. IfSat (Show (a -> a)) => (a -> a) -> String
showFun Bool -> Bool
not
    ]