packages feed

hix-0.7.0: lib/Hix/Managed/Cabal/Targets.hs

module Hix.Managed.Cabal.Targets where

import Distribution.Client.Dependency (
  PackagePreference (PackageInstalledPreference, PackageVersionPreference),
  PackageProperty (PackagePropertyVersion),
  PackageSpecifier (NamedPackage),
  )
import Distribution.Solver.Types.InstalledPreference (InstalledPreference (PreferInstalled, PreferOldest))
import Distribution.Version (orEarlierVersion, orLaterVersion)

import Hix.Class.Map (nToWith)
import qualified Hix.Data.PackageName as PackageName
import Hix.Data.PackageName (PackageName)
import Hix.Data.Version (VersionRange)
import Hix.Data.VersionBounds (Bound (BoundLower, BoundUpper), VersionBounds, maybeRange)
import Hix.Managed.Cabal.Data.SolveTarget (SolveTarget (..))
import qualified Hix.Managed.Data.Constraints
import Hix.Managed.Data.Constraints (EnvConstraints, MutationConstraints (MutationConstraints))

reifyBounds :: VersionBounds -> Maybe VersionRange
reifyBounds =
  maybeRange \case
    BoundLower -> orLaterVersion
    BoundUpper -> orEarlierVersion

solveTarget ::
  PackageName ->
  MutationConstraints ->
  SolveTarget
solveTarget package MutationConstraints {mutation, oldest, installed, prefer, force} =
  SolveTarget {dep, prefs}
  where
    dep = NamedPackage cabalName (PackagePropertyVersion <$> ranges)

    ranges = catMaybes [reifyBounds mutation, force]

    prefs = catMaybes [prefVersion <$> prefer, flag prefOldest oldest, flag prefInstalled installed]

    flag v = \case
      Just True -> Just v
      _ -> Nothing

    prefVersion = PackageVersionPreference cabalName
    prefOldest = PackageInstalledPreference cabalName PreferOldest
    prefInstalled = PackageInstalledPreference cabalName PreferInstalled

    cabalName = PackageName.toCabal package

solveTargets :: EnvConstraints -> [SolveTarget]
solveTargets = nToWith solveTarget