content: {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric #-}
  
  module Distribution.Types.Benchmark (
      Benchmark(..),
      emptyBenchmark,
      benchmarkType,
      benchmarkModules,
      benchmarkModulesAutogen
  ) where
  
  import Prelude ()
  import Distribution.Compat.Prelude
  
  import Distribution.Types.BuildInfo
  import Distribution.Types.BenchmarkType
  import Distribution.Types.BenchmarkInterface
  import Distribution.Types.UnqualComponentName
  
  import Distribution.ModuleName
  
  -- | A \"benchmark\" stanza in a cabal file.
  --
  data Benchmark = Benchmark {
          benchmarkName      :: UnqualComponentName,
          benchmarkInterface :: BenchmarkInterface,
          benchmarkBuildInfo :: BuildInfo
      }
      deriving (Generic, Show, Read, Eq, Typeable, Data)
  
  instance Binary Benchmark
  
  instance Monoid Benchmark where
      mempty = Benchmark {
          benchmarkName      = mempty,
          benchmarkInterface = mempty,
          benchmarkBuildInfo = mempty
      }
      mappend = (<>)
  
  instance Semigroup Benchmark where
      a <> b = Benchmark {
          benchmarkName      = combine' benchmarkName,
          benchmarkInterface = combine  benchmarkInterface,
          benchmarkBuildInfo = combine  benchmarkBuildInfo
      }
          where combine  field = field a `mappend` field b
                combine' field = case ( unUnqualComponentName $ field a
                                      , unUnqualComponentName $ field b) of
                          ("", _) -> field b
                          (_, "") -> field a
                          (x, y) -> error $ "Ambiguous values for test field: '"
                              ++ x ++ "' and '" ++ y ++ "'"
  
  emptyBenchmark :: Benchmark
  emptyBenchmark = mempty
  
  benchmarkType :: Benchmark -> BenchmarkType
  benchmarkType benchmark = case benchmarkInterface benchmark of
    BenchmarkExeV10 ver _              -> BenchmarkTypeExe ver
    BenchmarkUnsupported benchmarktype -> benchmarktype
  
  -- | Get all the module names from a benchmark.
  benchmarkModules :: Benchmark -> [ModuleName]
  benchmarkModules benchmark = otherModules (benchmarkBuildInfo benchmark)
  
  -- | Get all the auto generated module names from a benchmark.
  -- This are a subset of 'benchmarkModules'.
  benchmarkModulesAutogen :: Benchmark -> [ModuleName]
  benchmarkModulesAutogen benchmark = autogenModules (benchmarkBuildInfo benchmark)
  