{-# LANGUAGE PatternGuards, Rank2Types #-} module CabalBounds.Targets ( Targets(..) , Target(..) , targets , dependenciesOf ) where import Control.Lens import Distribution.PackageDescription (GenericPackageDescription(..)) import Distribution.Package (Dependency(..)) import CabalBounds.Args (Args) import qualified CabalBounds.Args as A import qualified CabalBounds.Lenses as L data Targets = Targets [Target] | AllTargets deriving (Show, Eq) data Target = Library | Executable String | TestSuite String | Benchmark String deriving (Show, Eq) targets :: Args -> Targets targets args | ts@(_:_) <- concat [ if (A.library args) then [Library] else [] , map Executable (A.executable args) , map TestSuite (A.testSuite args) , map Benchmark (A.benchmark args) ] = Targets ts | otherwise = AllTargets dependenciesOf :: Target -> Traversal' GenericPackageDescription [Dependency] dependenciesOf Library = L.dependenciesOfLib dependenciesOf (Executable exe) = L.dependenciesOfExe exe dependenciesOf (TestSuite test) = L.dependenciesOfTest test dependenciesOf (Benchmark benchm) = L.dependenciesOfBenchm benchm