packages feed

cabal-bounds-0.7: lib/CabalBounds/Dependencies.hs

{-# LANGUAGE PatternGuards, Rank2Types #-}

module CabalBounds.Dependencies
   ( Dependencies(..)
   , dependencies
   , filterDependency
   ) where

import Control.Lens
import qualified CabalBounds.Args as A
import Distribution.Package (Dependency(..), PackageName(..))

-- | Which dependencies in the cabal file should the considered.
data Dependencies = AllDependencies              -- ^ all dependencies
                  | OnlyDependencies [String]    -- ^ only the listed dependencies
                  | IgnoreDependencies [String]  -- ^ all dependencies but the listed ones
                  deriving (Show, Eq)


dependencies :: A.Args -> Dependencies
dependencies args
   | ds@(_:_) <- A.only args
   = OnlyDependencies ds

   | ds@(_:_) <- A.ignore args
   = IgnoreDependencies ds

   | otherwise
   = AllDependencies


filterDependency :: Dependencies -> Traversal' Dependency Dependency
filterDependency AllDependencies =
   filtered (const True)

filterDependency (OnlyDependencies deps) =
   filtered (\(Dependency (PackageName pkgName) _) -> pkgName `elem` deps)

filterDependency (IgnoreDependencies deps) =
   filtered (\(Dependency (PackageName pkgName) _) -> pkgName `notElem` deps)