module CabalBounds.Drop
( drop
) where
import Prelude hiding (drop)
import qualified Distribution.PackageDescription as C
import qualified Distribution.Package as C
import qualified Distribution.Version as C
import Control.Lens
import CabalBounds.Bound (Bound(..))
import CabalBounds.Targets (Targets(..), dependenciesOf)
import CabalBounds.Dependencies (Dependencies, filterDependencies)
import CabalBounds.Lenses
import Data.List (foldl')
drop :: Bound -> Targets -> Dependencies -> C.GenericPackageDescription -> C.GenericPackageDescription
drop bound AllTargets deps pkgDescrp =
pkgDescrp & dependenciesOfLib . filterDeps %~ dropFromDep
& dependenciesOfAllExes . filterDeps %~ dropFromDep
& dependenciesOfAllTests . filterDeps %~ dropFromDep
& dependenciesOfAllBenchms . filterDeps %~ dropFromDep
where
filterDeps = filterDependencies deps
dropFromDep = dropFromDependency bound
drop bound (Targets targets) deps pkgDescrp =
foldl' dropFromTarget pkgDescrp targets
where
dropFromTarget pkgDescrp target =
pkgDescrp & (dependenciesOf target) . filterDeps %~ dropFromDep
filterDeps = filterDependencies deps
dropFromDep = dropFromDependency bound
dropFromDependency :: Bound -> C.Dependency -> C.Dependency
dropFromDependency UpperBound (C.Dependency pkgName versionRange) = C.Dependency pkgName versionRange'
where
versionRange'
| Just vi <- C.mkVersionIntervals intervals'
= C.fromVersionIntervals vi
| otherwise
= versionRange
intervals' = map (& _2 .~ C.NoUpperBound) (C.asVersionIntervals versionRange)
dropFromDependency _ (C.Dependency pkgName _) = C.Dependency pkgName C.anyVersion