-------------------------------------------------------------------------
--
--  Haskell: The Craft of Functional Programming
--  Simon Thompson
--  (c) Addison-Wesley, 1996-2011.
--
--  QCfuns
--
-------------------------------------------------------------------------

module QCfuns where

import Test.QuickCheck
import System.IO.Unsafe -- for unsafePerformIO

-- Sampling and showing functions

sampleFun :: (Arbitrary a,Show a, Show b)  => (a -> b) -> IO String

sampleFun :: forall a b. (Arbitrary a, Show a, Show b) => (a -> b) -> IO String
sampleFun a -> b
f =
    do
      [a]
inputs <- Gen a -> IO [a]
forall a. Gen a -> IO [a]
sample' Gen a
forall a. Arbitrary a => Gen a
arbitrary
      let list :: [(a, b)]
list = [ (a
a,a -> b
f a
a) | a
a <- [a]
inputs ]
      String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> IO String) -> String -> IO String
forall a b. (a -> b) -> a -> b
$ [(a, b)] -> String
forall a b. (Show a, Show b) => [(a, b)] -> String
showMap [(a, b)]
list

showMap :: (Show a, Show b) => [(a,b)] -> String

showMap :: forall a b. (Show a, Show b) => [(a, b)] -> String
showMap [] = String
"\n"
showMap [(a
a,b
b)] = (a, b) -> String
forall a b. (Show a, Show b) => (a, b) -> String
showPair (a
a,b
b) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n"
showMap ((a, b)
p:[(a, b)]
ps)  = (a, b) -> String
forall a b. (Show a, Show b) => (a, b) -> String
showPair (a, b)
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" ," String -> String -> String
forall a. [a] -> [a] -> [a]
++ [(a, b)] -> String
forall a b. (Show a, Show b) => [(a, b)] -> String
showMap [(a, b)]
ps

showPair :: (Show a, Show b) => (a,b) -> String

showPair :: forall a b. (Show a, Show b) => (a, b) -> String
showPair (a
a,b
b) = String
"("String -> String -> String
forall a. [a] -> [a] -> [a]
++a -> String
forall a. Show a => a -> String
show a
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"|->" String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show b
b String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"

instance (Arbitrary a, Show a, Show b) => Show (a -> b) where
    show :: (a -> b) -> String
show = IO String -> String
forall a. IO a -> a
unsafePerformIO (IO String -> String)
-> ((a -> b) -> IO String) -> (a -> b) -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> IO String
forall a b. (Arbitrary a, Show a, Show b) => (a -> b) -> IO String
sampleFun