packages feed

hix-0.9.0: lib/Hix/Managed/ManagedPackage.hs

module Hix.Managed.ManagedPackage where

import Control.Lens (each, (%~))
import Distribution.Version (VersionRange, removeLowerBound)

import Hix.Class.Map (nFlatten, nGenWith, nKeys, nMap, nOver)
import Hix.Data.Bounds (Ranges)
import Hix.Data.Dep (Dep (..))
import Hix.Data.PackageName (LocalPackage, PackageName)
import qualified Hix.Managed.Data.ManagedPackage
import Hix.Managed.Data.ManagedPackage (ManagedPackage, ProjectPackages)
import qualified Hix.Managed.Data.Mutable as Mutable
import Hix.Managed.Data.Mutable (MutableRanges)
import Hix.Managed.Data.Packages (Packages)
import Hix.Managed.Data.Targets (Targets, sortTargets)

forTargets ::
  ProjectPackages ->
  [LocalPackage] ->
  (Targets, MutableRanges)
forTargets packages targetNames =
  (targets, nFlatten id targetRanges)
  where
    targetRanges :: Packages MutableRanges
    targetRanges = Mutable.forTargets targets allRanges

    targets = sortTargets onlyDepNames targetNames

    onlyDepNames :: Packages [PackageName]
    onlyDepNames = nMap nKeys allRanges

    allRanges :: Packages Ranges
    allRanges =
      nOver onlyDeps $ nGenWith \ Dep {package, version} -> (package, version)

    onlyDeps :: Packages [Dep]
    onlyDeps = nMap (.deps) packages

updateRanges ::
  (PackageName -> VersionRange -> VersionRange) ->
  ManagedPackage ->
  ManagedPackage
updateRanges f =
  #deps . each %~ \ Dep {version = original, ..} ->
    Dep {version = f package original, ..}

overRanges :: (VersionRange -> VersionRange) -> ManagedPackage -> ManagedPackage
overRanges f = #deps . each . #version %~ f

removeLowerBounds :: ManagedPackage -> ManagedPackage
removeLowerBounds = overRanges removeLowerBound