content: 
  module Main where
  
  import Config
  import FFT
  import HighPass
  
  import Prelude                                          as P
  import Data.Label
  import System.Exit
  import System.Environment
  import System.FilePath
  
  import Data.Array.Accelerate                            as A
  import Data.Array.Accelerate.IO.Codec.BMP               as A
  import Data.Array.Accelerate.Examples.Internal          as A
  
  
  -- Main routine ----------------------------------------------------------------
  
  main :: IO ()
  main
    = do
          beginMonitoring
          (conf, opts, rest)      <- parseArgs options defaults header footer
          (fileIn, fileOut)       <- case rest of
            (i:o:_) -> return (i,o)
            _       -> withArgs ["--help"] $ parseArgs options defaults header footer
                    >> exitSuccess
  
          -- Read in the image file
          img   <- either (error . show) id `fmap` A.readImageFromBMP fileIn
  
          -- Set up the operations
          let (file,bmp)  = splitExtension fileOut
              fileMag     = file P.++ "-mag"   <.> bmp
              filePhase   = file P.++ "-phase" <.> bmp
              fileHP      = file P.++ "-hp"    <.> bmp
  
              cutoff      = get configCutoff conf
              clip        = get configClip conf
              backend     = get optBackend opts
  
              -- Write out the images to file
              --
              highpass     = run backend $ highpassFFT cutoff (use img)
              (mag, phase) = run backend $ imageFFT    clip   (use img)
  
          writeImageToBMP fileHP    highpass
          writeImageToBMP fileMag   mag
          writeImageToBMP filePhase phase
  
          runBenchmarks opts (P.drop 2 rest)
            [ bench "highpass" $ whnf (run1 backend (highpassFFT cutoff)) img
            , bench "fft"      $ whnf (run1 backend (imageFFT    clip))   img
            ]
  
  
  