content: #!/usr/bin/env runhaskell
  	$Id$
  This file defines a command
       quickCheck <options> <files>
  which invokes quickCheck on all properties defined in the files given as
  arguments, by generating an input script for hugs and then invoking it.
  quickCheck recognises the options
       +names     print the name of each property before checking it
       -names     do not print property names (the default)
  Other options (beginning with + or -) are passed unchanged to hugs.
  --
  Change the first line of this file to the location of runhugs on your
  system.
  Make the file executable.
  --
  TODO:
  someone on #haskell asked about supporting QC tests inside LaTeX, ex. \{begin} \{end}, how?
  add a verbosity switch that uses verboseCheck instead of quickCheck
  
  \begin{code}
  import System.Environment
  import System.Cmd
  import Data.List
  
  main :: IO ()
  main = do as<-getArgs
            sequence_ (map (process (filter isOption as))
  	                 (filter (not.isOption) as))
  
  process opts file =
         let (namesOpt,opts') = getOption "names" "-names" opts in
         do xs<-readFile file
            let names = nub$ filter (\x -> "prop_" `isPrefixOf` x)
  	                (map (\ s -> case lex s of
                                  (r, _) : _ -> r
                                  _ -> error s) (lines xs))
            if null names then
  	      putStr (file++": no properties to check\n")
  	    else do writeFile "ghciin"$
  	              unlines ((":l "++file):
  	                       [(if namesOpt=="+names" then
  			           "putStr \""++p++": \" >> "
  				 else "") ++
  				"Test.QuickCheck.quickCheck "++p | p<-names])
  	            system ("ghci -w "++options opts'++" <ghciin")
  	            return ()
  
  isOption xs = head xs `elem` "-+"
  
  options opts = unwords ["\""++opt++"\"" | opt<-opts]
  
  getOption name def opts =
    let opt = head [opt | opt<-opts++[def], isPrefixOf name (drop 1 opt)] in
      (opt, filter (/=opt) opts)
  \end{code}