module CabalBounds.Drop
( drop
) where
import Prelude hiding (drop)
import Control.Lens
import CabalBounds.Bound (DropBound(..))
import CabalBounds.Dependencies (Dependencies, filterDependency)
import qualified CabalLenses as CL
import Data.List (foldl')
import Distribution.PackageDescription (GenericPackageDescription)
import Distribution.Package (Dependency(..))
import Distribution.Version (mkVersionIntervals, fromVersionIntervals, asVersionIntervals, UpperBound(..), anyVersion)
drop :: DropBound -> [CL.Section] -> Dependencies -> GenericPackageDescription -> GenericPackageDescription
drop bound sections deps pkgDescrp =
foldl' dropFromSection pkgDescrp sections
where
dropFromSection pkgDescrp section =
pkgDescrp & CL.dependencyIf condVars section . filterDep %~ dropFromDep
filterDep = filterDependency deps
dropFromDep = dropFromDependency bound
condVars = CL.fromDefaults pkgDescrp
dropFromDependency :: DropBound -> Dependency -> Dependency
dropFromDependency DropUpper (Dependency pkgName versionRange) = Dependency pkgName versionRange'
where
versionRange'
| Just vi <- mkVersionIntervals intervals'
= fromVersionIntervals vi
| otherwise
= versionRange
intervals' = map (& _2 .~ NoUpperBound) (asVersionIntervals versionRange)
dropFromDependency DropBoth (Dependency pkgName _) = Dependency pkgName anyVersion