packages feed

cabal-bounds-0.2: src/CabalBounds/Dependencies.hs

{-# LANGUAGE PatternGuards, Rank2Types #-}

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

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

data Dependencies = AllDependencies
                  | OnlyDependencies [String]
                  | IgnoreDependencies [String]
                  deriving (Show, Eq)


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

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

   | otherwise
   = AllDependencies


filterDependencies :: Dependencies -> Traversal' [Dependency] Dependency
filterDependencies AllDependencies =
   traversed

filterDependencies (OnlyDependencies deps) =
   traversed . filtered (\(Dependency (PackageName pkgName) _) -> any (== pkgName) deps)

filterDependencies (IgnoreDependencies deps) =
   traversed . filtered (\(Dependency (PackageName pkgName) _) -> all (/= pkgName) deps)