packages feed

hix-0.7.1: lib/Hix/Managed/Cabal/Sort.hs

module Hix.Managed.Cabal.Sort where

import qualified Data.Map.Strict as Map
import Data.Map.Strict ((!?))
import Distribution.Client.SolverInstallPlan (topologicalOrder)
import Exon (exon)

import Hix.Data.Monad (M)
import qualified Hix.Data.PackageId
import qualified Hix.Log as Log
import Hix.Managed.Cabal.Data.SolveResources (SolveResources)
import Hix.Managed.Cabal.Print (resolverPackageId)
import Hix.Managed.Cabal.Solve (solveForTargets)
import Hix.Managed.Cabal.Targets (solveTarget)
import Hix.Managed.Data.Mutable (MutableDep (MutableDep))
import Hix.Managed.Data.Mutation (DepMutation (..))
import Hix.Data.PackageName (PackageName)

sortDeps ::
  ∀ a .
  SolveResources ->
  (a -> PackageName) ->
  [a] ->
  M [a]
sortDeps resources name mutations =
  solveForTargets resources id targets >>= \case
    Right plan ->
      pure (mapMaybe original (topologicalOrder plan))
    Left err -> do
      Log.error [exon|No plan for mutations: ##{err}|]
      pure mutations
  where
    original k = byName !? (resolverPackageId k).name
    byName = Map.fromList [(name m, m) | m <- mutations]
    targets = [solveTarget (name m) mempty | m <- mutations]

sortMutations ::
  ∀ a .
  SolveResources ->
  [DepMutation a] ->
  M [DepMutation a]
sortMutations resources =
  sortDeps resources name
  where
    name DepMutation {package = MutableDep package} = package