From c2c73da936d295a6246f22bf30ef63da6ea8b12a Mon Sep 17 00:00:00 2001
From: Edsko de Vries <edsko@well-typed.com>
Date: Fri, 27 Mar 2015 16:39:19 +0000
Subject: [PATCH] Code layout

This commit does nothing but rearrange the Modular.Dependency module into a
number of separate sections, so that's a bit clearer to see what's what. No
actual code changes here whatsoever.
---
 .../Client/Dependency/Modular/Dependency.hs   | 126 ++++++++++++++----
 1 file changed, 97 insertions(+), 29 deletions(-)

diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs b/cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs
index 31d841115e..5282de4d71 100644
--- a/cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs
+++ b/cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs
@@ -1,5 +1,42 @@
 {-# LANGUAGE DeriveFunctor #-}
-module Distribution.Client.Dependency.Modular.Dependency where
+module Distribution.Client.Dependency.Modular.Dependency (
+    -- * Variables
+    Var(..)
+  , simplifyVar
+  , showVar
+    -- * Conflict sets
+  , ConflictSet
+  , showCS
+    -- * Constrained instances
+  , CI(..)
+  , showCI
+  , merge
+    -- * Flagged dependencies
+  , FlaggedDeps
+  , FlaggedDep(..)
+  , TrueFlaggedDeps
+  , FalseFlaggedDeps
+  , Dep(..)
+  , showDep
+    -- * Reverse dependency map
+  , RevDepMap
+    -- * Goals
+  , Goal(..)
+  , GoalReason(..)
+  , GoalReasonChain
+  , QGoalReasonChain
+  , ResetGoal(..)
+  , toConflictSet
+  , goalReasonToVars
+  , goalReasonChainToVars
+  , goalReasonChainsToVars
+    -- * Open goals
+  , OpenGoal(..)
+  , close
+    -- * Version ranges pairsed with origins (goals)
+  , VROrigin
+  , collapse
+  ) where
 
 import Prelude hiding (pi)
 
@@ -11,6 +48,10 @@ import Distribution.Client.Dependency.Modular.Flag
 import Distribution.Client.Dependency.Modular.Package
 import Distribution.Client.Dependency.Modular.Version
 
+{-------------------------------------------------------------------------------
+  Variables
+-------------------------------------------------------------------------------}
+
 -- | The type of variables that play a role in the solver.
 -- Note that the tree currently does not use this type directly,
 -- and rather has separate tree nodes for the different types of
@@ -37,11 +78,19 @@ showVar (P qpn) = showQPN qpn
 showVar (F qfn) = showQFN qfn
 showVar (S qsn) = showQSN qsn
 
+{-------------------------------------------------------------------------------
+  Conflict sets
+-------------------------------------------------------------------------------}
+
 type ConflictSet qpn = Set (Var qpn)
 
 showCS :: ConflictSet QPN -> String
 showCS = intercalate ", " . L.map showVar . S.toList
 
+{-------------------------------------------------------------------------------
+  Constrained instances
+-------------------------------------------------------------------------------}
+
 -- | Constrained instance. If the choice has already been made, this is
 -- a fixed instance, and we record the package name for which the choice
 -- is for convenience. Otherwise, it is a list of version ranges paired with
@@ -49,17 +98,6 @@ showCS = intercalate ", " . L.map showVar . S.toList
 data CI qpn = Fixed I (Goal qpn) | Constrained [VROrigin qpn]
   deriving (Eq, Show, Functor)
 
-instance ResetGoal CI where
-  resetGoal g (Fixed i _)       = Fixed i g
-  resetGoal g (Constrained vrs) = Constrained (L.map (\ (x, y) -> (x, resetGoal g y)) vrs)
-
-type VROrigin qpn = (VR, Goal qpn)
-
--- | Helper function to collapse a list of version ranges with origins into
--- a single, simplified, version range.
-collapse :: [VROrigin qpn] -> VR
-collapse = simplifyVR . L.foldr (.&&.) anyVR . L.map fst
-
 showCI :: CI QPN -> String
 showCI (Fixed i _)      = "==" ++ showI i
 showCI (Constrained vr) = showVR (collapse vr)
@@ -91,6 +129,9 @@ merge c@(Fixed (I v _) g1)   (Constrained rs) = go rs -- I tried "reverse rs" he
 merge c@(Constrained _)    d@(Fixed _ _)      = merge d c
 merge   (Constrained rs)     (Constrained ss) = Right (Constrained (rs ++ ss))
 
+{-------------------------------------------------------------------------------
+  Flagged dependencies
+-------------------------------------------------------------------------------}
 
 type FlaggedDeps qpn = [FlaggedDep qpn]
 
@@ -119,29 +160,23 @@ showDep (Dep qpn (Constrained [(vr, Goal v _)])) =
 showDep (Dep qpn ci                            ) =
   showQPN qpn ++ showCI ci
 
-instance ResetGoal Dep where
-  resetGoal g (Dep qpn ci) = Dep qpn (resetGoal g ci)
+{-------------------------------------------------------------------------------
+  Reverse dependency map
+-------------------------------------------------------------------------------}
 
 -- | A map containing reverse dependencies between qualified
 -- package names.
 type RevDepMap = Map QPN [QPN]
 
+{-------------------------------------------------------------------------------
+  Goals
+-------------------------------------------------------------------------------}
+
 -- | Goals are solver variables paired with information about
 -- why they have been introduced.
 data Goal qpn = Goal (Var qpn) (GoalReasonChain qpn)
   deriving (Eq, Show, Functor)
 
-class ResetGoal f where
-  resetGoal :: Goal qpn -> f qpn -> f qpn
-
-instance ResetGoal Goal where
-  resetGoal = const
-
--- | For open goals as they occur during the build phase, we need to store
--- additional information about flags.
-data OpenGoal = OpenGoal (FlaggedDep QPN) QGoalReasonChain
-  deriving (Eq, Show)
-
 -- | Reasons why a goal can be added to a goal set.
 data GoalReason qpn =
     UserGoal
@@ -156,6 +191,24 @@ type GoalReasonChain qpn = [GoalReason qpn]
 
 type QGoalReasonChain = GoalReasonChain QPN
 
+class ResetGoal f where
+  resetGoal :: Goal qpn -> f qpn -> f qpn
+
+instance ResetGoal CI where
+  resetGoal g (Fixed i _)       = Fixed i g
+  resetGoal g (Constrained vrs) = Constrained (L.map (\ (x, y) -> (x, resetGoal g y)) vrs)
+
+instance ResetGoal Dep where
+  resetGoal g (Dep qpn ci) = Dep qpn (resetGoal g ci)
+
+instance ResetGoal Goal where
+  resetGoal = const
+
+-- | Compute a conflic set from a goal. The conflict set contains the
+-- closure of goal reasons as well as the variable of the goal itself.
+toConflictSet :: Ord qpn => Goal qpn -> ConflictSet qpn
+toConflictSet (Goal g grs) = S.insert (simplifyVar g) (goalReasonChainToVars grs)
+
 goalReasonToVars :: GoalReason qpn -> ConflictSet qpn
 goalReasonToVars UserGoal                 = S.empty
 goalReasonToVars (PDependency (PI qpn _)) = S.singleton (P qpn)
@@ -168,6 +221,15 @@ goalReasonChainToVars = S.unions . L.map goalReasonToVars
 goalReasonChainsToVars :: Ord qpn => [GoalReasonChain qpn] -> ConflictSet qpn
 goalReasonChainsToVars = S.unions . L.map goalReasonChainToVars
 
+{-------------------------------------------------------------------------------
+  Open goals
+-------------------------------------------------------------------------------}
+
+-- | For open goals as they occur during the build phase, we need to store
+-- additional information about flags.
+data OpenGoal = OpenGoal (FlaggedDep QPN) QGoalReasonChain
+  deriving (Eq, Show)
+
 -- | Closes a goal, i.e., removes all the extraneous information that we
 -- need only during the build phase.
 close :: OpenGoal -> Goal QPN
@@ -175,7 +237,13 @@ close (OpenGoal (Simple (Dep qpn _)) gr) = Goal (P qpn) gr
 close (OpenGoal (Flagged qfn _ _ _ ) gr) = Goal (F qfn) gr
 close (OpenGoal (Stanza  qsn _)      gr) = Goal (S qsn) gr
 
--- | Compute a conflic set from a goal. The conflict set contains the
--- closure of goal reasons as well as the variable of the goal itself.
-toConflictSet :: Ord qpn => Goal qpn -> ConflictSet qpn
-toConflictSet (Goal g grs) = S.insert (simplifyVar g) (goalReasonChainToVars grs)
+{-------------------------------------------------------------------------------
+  Version ranges paired with origins
+-------------------------------------------------------------------------------}
+
+type VROrigin qpn = (VR, Goal qpn)
+
+-- | Helper function to collapse a list of version ranges with origins into
+-- a single, simplified, version range.
+collapse :: [VROrigin qpn] -> VR
+collapse = simplifyVR . L.foldr (.&&.) anyVR . L.map fst
-- 
GitLab