{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE RecordWildCards #-}
module Distribution.Solver.Modular.Dependency (
Var(..)
, showVar
, varPN
, ConflictSet
, ConflictMap
, CS.showConflictSet
, CI(..)
, FlaggedDeps
, FlaggedDep(..)
, LDep(..)
, Dep(..)
, PkgComponent(..)
, ExposedComponent(..)
, DependencyReason(..)
, showDependencyReason
, flattenFlaggedDeps
, QualifyOptions(..)
, qualifyDeps
, unqualifyDeps
, RevDepMap
, Goal(..)
, GoalReason(..)
, QGoalReason
, goalToVar
, varToConflictSet
, goalReasonToConflictSet
, goalReasonToConflictSetWithConflict
, dependencyReasonToConflictSet
, dependencyReasonToConflictSetWithVersionConstraintConflict
, dependencyReasonToConflictSetWithVersionConflict
) where
import Prelude ()
import qualified Data.Map as M
import qualified Data.Set as S
import Distribution.Solver.Compat.Prelude hiding (pi)
import Language.Haskell.Extension (Extension(..), Language(..))
import Distribution.Solver.Modular.ConflictSet (ConflictSet, ConflictMap)
import Distribution.Solver.Modular.Flag
import Distribution.Solver.Modular.Package
import Distribution.Solver.Modular.Var
import Distribution.Solver.Modular.Version
import qualified Distribution.Solver.Modular.ConflictSet as CS
import Distribution.Solver.Types.ComponentDeps (Component(..))
import Distribution.Solver.Types.PackagePath
import Distribution.Types.LibraryName
import Distribution.Types.PkgconfigVersionRange
import Distribution.Types.UnqualComponentName
data CI = Fixed I | Constrained VR
deriving (CI -> CI -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CI -> CI -> Bool
$c/= :: CI -> CI -> Bool
== :: CI -> CI -> Bool
$c== :: CI -> CI -> Bool
Eq, Int -> CI -> ShowS
[CI] -> ShowS
CI -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CI] -> ShowS
$cshowList :: [CI] -> ShowS
show :: CI -> String
$cshow :: CI -> String
showsPrec :: Int -> CI -> ShowS
$cshowsPrec :: Int -> CI -> ShowS
Show)
type FlaggedDeps qpn = [FlaggedDep qpn]
data FlaggedDep qpn =
Flagged (FN qpn) FInfo (TrueFlaggedDeps qpn) (FalseFlaggedDeps qpn)
| Stanza (SN qpn) (TrueFlaggedDeps qpn)
| Simple (LDep qpn) Component
flattenFlaggedDeps :: FlaggedDeps qpn -> [(LDep qpn, Component)]
flattenFlaggedDeps :: forall qpn. FlaggedDeps qpn -> [(LDep qpn, Component)]
flattenFlaggedDeps = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall qpn. FlaggedDep qpn -> [(LDep qpn, Component)]
aux
where
aux :: FlaggedDep qpn -> [(LDep qpn, Component)]
aux :: forall qpn. FlaggedDep qpn -> [(LDep qpn, Component)]
aux (Flagged FN qpn
_ FInfo
_ TrueFlaggedDeps qpn
t TrueFlaggedDeps qpn
f) = forall qpn. FlaggedDeps qpn -> [(LDep qpn, Component)]
flattenFlaggedDeps TrueFlaggedDeps qpn
t forall a. [a] -> [a] -> [a]
++ forall qpn. FlaggedDeps qpn -> [(LDep qpn, Component)]
flattenFlaggedDeps TrueFlaggedDeps qpn
f
aux (Stanza SN qpn
_ TrueFlaggedDeps qpn
t) = forall qpn. FlaggedDeps qpn -> [(LDep qpn, Component)]
flattenFlaggedDeps TrueFlaggedDeps qpn
t
aux (Simple LDep qpn
d Component
c) = [(LDep qpn
d, Component
c)]
type TrueFlaggedDeps qpn = FlaggedDeps qpn
type FalseFlaggedDeps qpn = FlaggedDeps qpn
data LDep qpn = LDep (DependencyReason qpn) (Dep qpn)
data Dep qpn = Dep (PkgComponent qpn) CI
| Ext Extension
| Lang Language
| Pkg PkgconfigName PkgconfigVersionRange
deriving forall a b. a -> Dep b -> Dep a
forall a b. (a -> b) -> Dep a -> Dep b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Dep b -> Dep a
$c<$ :: forall a b. a -> Dep b -> Dep a
fmap :: forall a b. (a -> b) -> Dep a -> Dep b
$cfmap :: forall a b. (a -> b) -> Dep a -> Dep b
Functor
data PkgComponent qpn = PkgComponent qpn ExposedComponent
deriving (PkgComponent qpn -> PkgComponent qpn -> Bool
forall qpn. Eq qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PkgComponent qpn -> PkgComponent qpn -> Bool
$c/= :: forall qpn. Eq qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
== :: PkgComponent qpn -> PkgComponent qpn -> Bool
$c== :: forall qpn. Eq qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
Eq, PkgComponent qpn -> PkgComponent qpn -> Bool
PkgComponent qpn -> PkgComponent qpn -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {qpn}. Ord qpn => Eq (PkgComponent qpn)
forall qpn. Ord qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
forall qpn.
Ord qpn =>
PkgComponent qpn -> PkgComponent qpn -> Ordering
forall qpn.
Ord qpn =>
PkgComponent qpn -> PkgComponent qpn -> PkgComponent qpn
min :: PkgComponent qpn -> PkgComponent qpn -> PkgComponent qpn
$cmin :: forall qpn.
Ord qpn =>
PkgComponent qpn -> PkgComponent qpn -> PkgComponent qpn
max :: PkgComponent qpn -> PkgComponent qpn -> PkgComponent qpn
$cmax :: forall qpn.
Ord qpn =>
PkgComponent qpn -> PkgComponent qpn -> PkgComponent qpn
>= :: PkgComponent qpn -> PkgComponent qpn -> Bool
$c>= :: forall qpn. Ord qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
> :: PkgComponent qpn -> PkgComponent qpn -> Bool
$c> :: forall qpn. Ord qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
<= :: PkgComponent qpn -> PkgComponent qpn -> Bool
$c<= :: forall qpn. Ord qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
< :: PkgComponent qpn -> PkgComponent qpn -> Bool
$c< :: forall qpn. Ord qpn => PkgComponent qpn -> PkgComponent qpn -> Bool
compare :: PkgComponent qpn -> PkgComponent qpn -> Ordering
$ccompare :: forall qpn.
Ord qpn =>
PkgComponent qpn -> PkgComponent qpn -> Ordering
Ord, forall a b. a -> PkgComponent b -> PkgComponent a
forall a b. (a -> b) -> PkgComponent a -> PkgComponent b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> PkgComponent b -> PkgComponent a
$c<$ :: forall a b. a -> PkgComponent b -> PkgComponent a
fmap :: forall a b. (a -> b) -> PkgComponent a -> PkgComponent b
$cfmap :: forall a b. (a -> b) -> PkgComponent a -> PkgComponent b
Functor, Int -> PkgComponent qpn -> ShowS
forall qpn. Show qpn => Int -> PkgComponent qpn -> ShowS
forall qpn. Show qpn => [PkgComponent qpn] -> ShowS
forall qpn. Show qpn => PkgComponent qpn -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PkgComponent qpn] -> ShowS
$cshowList :: forall qpn. Show qpn => [PkgComponent qpn] -> ShowS
show :: PkgComponent qpn -> String
$cshow :: forall qpn. Show qpn => PkgComponent qpn -> String
showsPrec :: Int -> PkgComponent qpn -> ShowS
$cshowsPrec :: forall qpn. Show qpn => Int -> PkgComponent qpn -> ShowS
Show)
data ExposedComponent =
ExposedLib LibraryName
| ExposedExe UnqualComponentName
deriving (ExposedComponent -> ExposedComponent -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ExposedComponent -> ExposedComponent -> Bool
$c/= :: ExposedComponent -> ExposedComponent -> Bool
== :: ExposedComponent -> ExposedComponent -> Bool
$c== :: ExposedComponent -> ExposedComponent -> Bool
Eq, Eq ExposedComponent
ExposedComponent -> ExposedComponent -> Bool
ExposedComponent -> ExposedComponent -> Ordering
ExposedComponent -> ExposedComponent -> ExposedComponent
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ExposedComponent -> ExposedComponent -> ExposedComponent
$cmin :: ExposedComponent -> ExposedComponent -> ExposedComponent
max :: ExposedComponent -> ExposedComponent -> ExposedComponent
$cmax :: ExposedComponent -> ExposedComponent -> ExposedComponent
>= :: ExposedComponent -> ExposedComponent -> Bool
$c>= :: ExposedComponent -> ExposedComponent -> Bool
> :: ExposedComponent -> ExposedComponent -> Bool
$c> :: ExposedComponent -> ExposedComponent -> Bool
<= :: ExposedComponent -> ExposedComponent -> Bool
$c<= :: ExposedComponent -> ExposedComponent -> Bool
< :: ExposedComponent -> ExposedComponent -> Bool
$c< :: ExposedComponent -> ExposedComponent -> Bool
compare :: ExposedComponent -> ExposedComponent -> Ordering
$ccompare :: ExposedComponent -> ExposedComponent -> Ordering
Ord, Int -> ExposedComponent -> ShowS
[ExposedComponent] -> ShowS
ExposedComponent -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExposedComponent] -> ShowS
$cshowList :: [ExposedComponent] -> ShowS
show :: ExposedComponent -> String
$cshow :: ExposedComponent -> String
showsPrec :: Int -> ExposedComponent -> ShowS
$cshowsPrec :: Int -> ExposedComponent -> ShowS
Show)
data DependencyReason qpn = DependencyReason qpn (Map Flag FlagValue) (S.Set Stanza)
deriving (forall a b. a -> DependencyReason b -> DependencyReason a
forall a b. (a -> b) -> DependencyReason a -> DependencyReason b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> DependencyReason b -> DependencyReason a
$c<$ :: forall a b. a -> DependencyReason b -> DependencyReason a
fmap :: forall a b. (a -> b) -> DependencyReason a -> DependencyReason b
$cfmap :: forall a b. (a -> b) -> DependencyReason a -> DependencyReason b
Functor, DependencyReason qpn -> DependencyReason qpn -> Bool
forall qpn.
Eq qpn =>
DependencyReason qpn -> DependencyReason qpn -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DependencyReason qpn -> DependencyReason qpn -> Bool
$c/= :: forall qpn.
Eq qpn =>
DependencyReason qpn -> DependencyReason qpn -> Bool
== :: DependencyReason qpn -> DependencyReason qpn -> Bool
$c== :: forall qpn.
Eq qpn =>
DependencyReason qpn -> DependencyReason qpn -> Bool
Eq, Int -> DependencyReason qpn -> ShowS
forall qpn. Show qpn => Int -> DependencyReason qpn -> ShowS
forall qpn. Show qpn => [DependencyReason qpn] -> ShowS
forall qpn. Show qpn => DependencyReason qpn -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DependencyReason qpn] -> ShowS
$cshowList :: forall qpn. Show qpn => [DependencyReason qpn] -> ShowS
show :: DependencyReason qpn -> String
$cshow :: forall qpn. Show qpn => DependencyReason qpn -> String
showsPrec :: Int -> DependencyReason qpn -> ShowS
$cshowsPrec :: forall qpn. Show qpn => Int -> DependencyReason qpn -> ShowS
Show)
showDependencyReason :: DependencyReason QPN -> String
showDependencyReason :: DependencyReason QPN -> String
showDependencyReason (DependencyReason QPN
qpn Map Flag FlagValue
flags Set Stanza
stanzas) =
forall a. [a] -> [[a]] -> [a]
intercalate String
" " forall a b. (a -> b) -> a -> b
$
QPN -> String
showQPN QPN
qpn
forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Flag -> FlagValue -> String
showFlagValue) (forall k a. Map k a -> [(k, a)]
M.toList Map Flag FlagValue
flags)
forall a. [a] -> [a] -> [a]
++ forall a b. (a -> b) -> [a] -> [b]
map (\Stanza
s -> Stanza -> Bool -> String
showSBool Stanza
s Bool
True) (forall a. Set a -> [a]
S.toList Set Stanza
stanzas)
data QualifyOptions = QO {
QualifyOptions -> Bool
qoBaseShim :: Bool
, QualifyOptions -> Bool
qoSetupIndependent :: Bool
}
deriving Int -> QualifyOptions -> ShowS
[QualifyOptions] -> ShowS
QualifyOptions -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QualifyOptions] -> ShowS
$cshowList :: [QualifyOptions] -> ShowS
show :: QualifyOptions -> String
$cshow :: QualifyOptions -> String
showsPrec :: Int -> QualifyOptions -> ShowS
$cshowsPrec :: Int -> QualifyOptions -> ShowS
Show
qualifyDeps :: QualifyOptions -> QPN -> FlaggedDeps PN -> FlaggedDeps QPN
qualifyDeps :: QualifyOptions -> QPN -> FlaggedDeps PN -> FlaggedDeps QPN
qualifyDeps QO{Bool
qoSetupIndependent :: Bool
qoBaseShim :: Bool
qoSetupIndependent :: QualifyOptions -> Bool
qoBaseShim :: QualifyOptions -> Bool
..} (Q pp :: PackagePath
pp@(PackagePath Namespace
ns Qualifier
q) PN
pn) = FlaggedDeps PN -> FlaggedDeps QPN
go
where
go :: FlaggedDeps PN -> FlaggedDeps QPN
go :: FlaggedDeps PN -> FlaggedDeps QPN
go = forall a b. (a -> b) -> [a] -> [b]
map FlaggedDep PN -> FlaggedDep QPN
go1
go1 :: FlaggedDep PN -> FlaggedDep QPN
go1 :: FlaggedDep PN -> FlaggedDep QPN
go1 (Flagged FN PN
fn FInfo
nfo FlaggedDeps PN
t FlaggedDeps PN
f) = forall qpn.
FN qpn
-> FInfo
-> TrueFlaggedDeps qpn
-> TrueFlaggedDeps qpn
-> FlaggedDep qpn
Flagged (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. PackagePath -> a -> Qualified a
Q PackagePath
pp) FN PN
fn) FInfo
nfo (FlaggedDeps PN -> FlaggedDeps QPN
go FlaggedDeps PN
t) (FlaggedDeps PN -> FlaggedDeps QPN
go FlaggedDeps PN
f)
go1 (Stanza SN PN
sn FlaggedDeps PN
t) = forall qpn. SN qpn -> TrueFlaggedDeps qpn -> FlaggedDep qpn
Stanza (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. PackagePath -> a -> Qualified a
Q PackagePath
pp) SN PN
sn) (FlaggedDeps PN -> FlaggedDeps QPN
go FlaggedDeps PN
t)
go1 (Simple LDep PN
dep Component
comp) = forall qpn. LDep qpn -> Component -> FlaggedDep qpn
Simple (LDep PN -> Component -> LDep QPN
goLDep LDep PN
dep Component
comp) Component
comp
goLDep :: LDep PN -> Component -> LDep QPN
goLDep :: LDep PN -> Component -> LDep QPN
goLDep (LDep DependencyReason PN
dr Dep PN
dep) Component
comp = forall qpn. DependencyReason qpn -> Dep qpn -> LDep qpn
LDep (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. PackagePath -> a -> Qualified a
Q PackagePath
pp) DependencyReason PN
dr) (Dep PN -> Component -> Dep QPN
goD Dep PN
dep Component
comp)
goD :: Dep PN -> Component -> Dep QPN
goD :: Dep PN -> Component -> Dep QPN
goD (Ext Extension
ext) Component
_ = forall qpn. Extension -> Dep qpn
Ext Extension
ext
goD (Lang Language
lang) Component
_ = forall qpn. Language -> Dep qpn
Lang Language
lang
goD (Pkg PkgconfigName
pkn PkgconfigVersionRange
vr) Component
_ = forall qpn. PkgconfigName -> PkgconfigVersionRange -> Dep qpn
Pkg PkgconfigName
pkn PkgconfigVersionRange
vr
goD (Dep dep :: PkgComponent PN
dep@(PkgComponent PN
qpn (ExposedExe UnqualComponentName
_)) CI
ci) Component
_ =
forall qpn. PkgComponent qpn -> CI -> Dep qpn
Dep (forall a. PackagePath -> a -> Qualified a
Q (Namespace -> Qualifier -> PackagePath
PackagePath Namespace
ns (PN -> PN -> Qualifier
QualExe PN
pn PN
qpn)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PkgComponent PN
dep) CI
ci
goD (Dep dep :: PkgComponent PN
dep@(PkgComponent PN
qpn (ExposedLib LibraryName
_)) CI
ci) Component
comp
| PN -> Bool
qBase PN
qpn = forall qpn. PkgComponent qpn -> CI -> Dep qpn
Dep (forall a. PackagePath -> a -> Qualified a
Q (Namespace -> Qualifier -> PackagePath
PackagePath Namespace
ns (PN -> Qualifier
QualBase PN
pn)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PkgComponent PN
dep) CI
ci
| Component -> Bool
qSetup Component
comp = forall qpn. PkgComponent qpn -> CI -> Dep qpn
Dep (forall a. PackagePath -> a -> Qualified a
Q (Namespace -> Qualifier -> PackagePath
PackagePath Namespace
ns (PN -> Qualifier
QualSetup PN
pn)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PkgComponent PN
dep) CI
ci
| Bool
otherwise = forall qpn. PkgComponent qpn -> CI -> Dep qpn
Dep (forall a. PackagePath -> a -> Qualified a
Q (Namespace -> Qualifier -> PackagePath
PackagePath Namespace
ns Qualifier
inheritedQ ) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PkgComponent PN
dep) CI
ci
inheritedQ :: Qualifier
inheritedQ :: Qualifier
inheritedQ = case Qualifier
q of
QualSetup PN
_ -> Qualifier
q
QualExe PN
_ PN
_ -> Qualifier
q
Qualifier
QualToplevel -> Qualifier
q
QualBase PN
_ -> Qualifier
QualToplevel
qBase :: PN -> Bool
qBase :: PN -> Bool
qBase PN
dep = Bool
qoBaseShim Bool -> Bool -> Bool
&& PN -> String
unPackageName PN
dep forall a. Eq a => a -> a -> Bool
== String
"base"
qSetup :: Component -> Bool
qSetup :: Component -> Bool
qSetup Component
comp = Bool
qoSetupIndependent Bool -> Bool -> Bool
&& Component
comp forall a. Eq a => a -> a -> Bool
== Component
ComponentSetup
unqualifyDeps :: FlaggedDeps QPN -> FlaggedDeps PN
unqualifyDeps :: FlaggedDeps QPN -> FlaggedDeps PN
unqualifyDeps = FlaggedDeps QPN -> FlaggedDeps PN
go
where
go :: FlaggedDeps QPN -> FlaggedDeps PN
go :: FlaggedDeps QPN -> FlaggedDeps PN
go = forall a b. (a -> b) -> [a] -> [b]
map FlaggedDep QPN -> FlaggedDep PN
go1
go1 :: FlaggedDep QPN -> FlaggedDep PN
go1 :: FlaggedDep QPN -> FlaggedDep PN
go1 (Flagged FN QPN
fn FInfo
nfo FlaggedDeps QPN
t FlaggedDeps QPN
f) = forall qpn.
FN qpn
-> FInfo
-> TrueFlaggedDeps qpn
-> TrueFlaggedDeps qpn
-> FlaggedDep qpn
Flagged (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QPN -> PN
unq FN QPN
fn) FInfo
nfo (FlaggedDeps QPN -> FlaggedDeps PN
go FlaggedDeps QPN
t) (FlaggedDeps QPN -> FlaggedDeps PN
go FlaggedDeps QPN
f)
go1 (Stanza SN QPN
sn FlaggedDeps QPN
t) = forall qpn. SN qpn -> TrueFlaggedDeps qpn -> FlaggedDep qpn
Stanza (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QPN -> PN
unq SN QPN
sn) (FlaggedDeps QPN -> FlaggedDeps PN
go FlaggedDeps QPN
t)
go1 (Simple LDep QPN
dep Component
comp) = forall qpn. LDep qpn -> Component -> FlaggedDep qpn
Simple (LDep QPN -> LDep PN
goLDep LDep QPN
dep) Component
comp
goLDep :: LDep QPN -> LDep PN
goLDep :: LDep QPN -> LDep PN
goLDep (LDep DependencyReason QPN
dr Dep QPN
dep) = forall qpn. DependencyReason qpn -> Dep qpn -> LDep qpn
LDep (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QPN -> PN
unq DependencyReason QPN
dr) (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QPN -> PN
unq Dep QPN
dep)
unq :: QPN -> PN
unq :: QPN -> PN
unq (Q PackagePath
_ PN
pn) = PN
pn
type RevDepMap = Map QPN [(Component, QPN)]
data Goal qpn = Goal (Var qpn) (GoalReason qpn)
deriving (Goal qpn -> Goal qpn -> Bool
forall qpn. Eq qpn => Goal qpn -> Goal qpn -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Goal qpn -> Goal qpn -> Bool
$c/= :: forall qpn. Eq qpn => Goal qpn -> Goal qpn -> Bool
== :: Goal qpn -> Goal qpn -> Bool
$c== :: forall qpn. Eq qpn => Goal qpn -> Goal qpn -> Bool
Eq, Int -> Goal qpn -> ShowS
forall qpn. Show qpn => Int -> Goal qpn -> ShowS
forall qpn. Show qpn => [Goal qpn] -> ShowS
forall qpn. Show qpn => Goal qpn -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Goal qpn] -> ShowS
$cshowList :: forall qpn. Show qpn => [Goal qpn] -> ShowS
show :: Goal qpn -> String
$cshow :: forall qpn. Show qpn => Goal qpn -> String
showsPrec :: Int -> Goal qpn -> ShowS
$cshowsPrec :: forall qpn. Show qpn => Int -> Goal qpn -> ShowS
Show, forall a b. a -> Goal b -> Goal a
forall a b. (a -> b) -> Goal a -> Goal b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Goal b -> Goal a
$c<$ :: forall a b. a -> Goal b -> Goal a
fmap :: forall a b. (a -> b) -> Goal a -> Goal b
$cfmap :: forall a b. (a -> b) -> Goal a -> Goal b
Functor)
data GoalReason qpn =
UserGoal
| DependencyGoal (DependencyReason qpn)
deriving (GoalReason qpn -> GoalReason qpn -> Bool
forall qpn. Eq qpn => GoalReason qpn -> GoalReason qpn -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GoalReason qpn -> GoalReason qpn -> Bool
$c/= :: forall qpn. Eq qpn => GoalReason qpn -> GoalReason qpn -> Bool
== :: GoalReason qpn -> GoalReason qpn -> Bool
$c== :: forall qpn. Eq qpn => GoalReason qpn -> GoalReason qpn -> Bool
Eq, Int -> GoalReason qpn -> ShowS
forall qpn. Show qpn => Int -> GoalReason qpn -> ShowS
forall qpn. Show qpn => [GoalReason qpn] -> ShowS
forall qpn. Show qpn => GoalReason qpn -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GoalReason qpn] -> ShowS
$cshowList :: forall qpn. Show qpn => [GoalReason qpn] -> ShowS
show :: GoalReason qpn -> String
$cshow :: forall qpn. Show qpn => GoalReason qpn -> String
showsPrec :: Int -> GoalReason qpn -> ShowS
$cshowsPrec :: forall qpn. Show qpn => Int -> GoalReason qpn -> ShowS
Show, forall a b. a -> GoalReason b -> GoalReason a
forall a b. (a -> b) -> GoalReason a -> GoalReason b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> GoalReason b -> GoalReason a
$c<$ :: forall a b. a -> GoalReason b -> GoalReason a
fmap :: forall a b. (a -> b) -> GoalReason a -> GoalReason b
$cfmap :: forall a b. (a -> b) -> GoalReason a -> GoalReason b
Functor)
type QGoalReason = GoalReason QPN
goalToVar :: Goal a -> Var a
goalToVar :: forall a. Goal a -> Var a
goalToVar (Goal Var a
v GoalReason a
_) = Var a
v
varToConflictSet :: Var QPN -> ConflictSet
varToConflictSet :: Var QPN -> ConflictSet
varToConflictSet = Var QPN -> ConflictSet
CS.singleton
goalReasonToConflictSet :: GoalReason QPN -> ConflictSet
goalReasonToConflictSet :: GoalReason QPN -> ConflictSet
goalReasonToConflictSet GoalReason QPN
UserGoal = ConflictSet
CS.empty
goalReasonToConflictSet (DependencyGoal DependencyReason QPN
dr) = DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSet DependencyReason QPN
dr
goalReasonToConflictSetWithConflict :: QPN -> GoalReason QPN -> ConflictSet
goalReasonToConflictSetWithConflict :: QPN -> GoalReason QPN -> ConflictSet
goalReasonToConflictSetWithConflict QPN
goal (DependencyGoal (DependencyReason QPN
qpn Map Flag FlagValue
flags Set Stanza
stanzas))
| forall k a. Map k a -> Bool
M.null Map Flag FlagValue
flags Bool -> Bool -> Bool
&& forall a. Set a -> Bool
S.null Set Stanza
stanzas =
Var QPN -> Conflict -> ConflictSet
CS.singletonWithConflict (forall qpn. qpn -> Var qpn
P QPN
qpn) forall a b. (a -> b) -> a -> b
$ QPN -> Conflict
CS.GoalConflict QPN
goal
goalReasonToConflictSetWithConflict QPN
_ GoalReason QPN
gr = GoalReason QPN -> ConflictSet
goalReasonToConflictSet GoalReason QPN
gr
dependencyReasonToConflictSet :: DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSet :: DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSet (DependencyReason QPN
qpn Map Flag FlagValue
flags Set Stanza
stanzas) =
[Var QPN] -> ConflictSet
CS.fromList forall a b. (a -> b) -> a -> b
$ forall qpn. qpn -> Var qpn
P QPN
qpn forall a. a -> [a] -> [a]
: [Var QPN]
flagVars forall a. [a] -> [a] -> [a]
++ forall a b. (a -> b) -> [a] -> [b]
map Stanza -> Var QPN
stanzaToVar (forall a. Set a -> [a]
S.toList Set Stanza
stanzas)
where
flagVars :: [Var QPN]
flagVars :: [Var QPN]
flagVars = [forall qpn. FN qpn -> Var qpn
F (forall qpn. qpn -> Flag -> FN qpn
FN QPN
qpn Flag
fn) | (Flag
fn, FlagValue
fv) <- forall k a. Map k a -> [(k, a)]
M.toList Map Flag FlagValue
flags, FlagValue
fv forall a. Eq a => a -> a -> Bool
/= FlagValue
FlagBoth]
stanzaToVar :: Stanza -> Var QPN
stanzaToVar :: Stanza -> Var QPN
stanzaToVar = forall qpn. SN qpn -> Var qpn
S forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall qpn. qpn -> Stanza -> SN qpn
SN QPN
qpn
dependencyReasonToConflictSetWithVersionConstraintConflict :: QPN
-> Ver
-> DependencyReason QPN
-> ConflictSet
dependencyReasonToConflictSetWithVersionConstraintConflict :: QPN -> Ver -> DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSetWithVersionConstraintConflict
QPN
dependency Ver
excludedVersion dr :: DependencyReason QPN
dr@(DependencyReason QPN
qpn Map Flag FlagValue
flags Set Stanza
stanzas)
| forall k a. Map k a -> Bool
M.null Map Flag FlagValue
flags Bool -> Bool -> Bool
&& forall a. Set a -> Bool
S.null Set Stanza
stanzas =
Var QPN -> Conflict -> ConflictSet
CS.singletonWithConflict (forall qpn. qpn -> Var qpn
P QPN
qpn) forall a b. (a -> b) -> a -> b
$
QPN -> Ver -> Conflict
CS.VersionConstraintConflict QPN
dependency Ver
excludedVersion
| Bool
otherwise = DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSet DependencyReason QPN
dr
dependencyReasonToConflictSetWithVersionConflict :: QPN
-> CS.OrderedVersionRange
-> DependencyReason QPN
-> ConflictSet
dependencyReasonToConflictSetWithVersionConflict :: QPN -> OrderedVersionRange -> DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSetWithVersionConflict
QPN
pkgWithVersionConstraint OrderedVersionRange
constraint dr :: DependencyReason QPN
dr@(DependencyReason QPN
qpn Map Flag FlagValue
flags Set Stanza
stanzas)
| forall k a. Map k a -> Bool
M.null Map Flag FlagValue
flags Bool -> Bool -> Bool
&& forall a. Set a -> Bool
S.null Set Stanza
stanzas =
Var QPN -> Conflict -> ConflictSet
CS.singletonWithConflict (forall qpn. qpn -> Var qpn
P QPN
qpn) forall a b. (a -> b) -> a -> b
$
QPN -> OrderedVersionRange -> Conflict
CS.VersionConflict QPN
pkgWithVersionConstraint OrderedVersionRange
constraint
| Bool
otherwise = DependencyReason QPN -> ConflictSet
dependencyReasonToConflictSet DependencyReason QPN
dr