{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}

-- | Copyright: (c) 2020-2021 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <berberman@yandex.com>
-- Stability: experimental
-- Portability: portable
-- The core functions of @arch-hs@.
module Distribution.ArchHs.Core
  ( getDependencies,
    cabalToPkgBuild,
    evalConditionTree,
    subsumeGHCVersion,

    -- * Helper functions
    collectLibDeps,
    collectExeDeps,
    collectTestDeps,
    collectSubLibDeps,
    collectSetupDeps,
  )
where

import qualified Algebra.Graph.Labelled.AdjacencyMap as G
import Data.Bifunctor (second)
import Data.Containers.ListUtils (nubOrd)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
import Data.Set (Set)
import qualified Data.Set as Set
import Distribution.ArchHs.CommunityDB (versionInCommunity)
import Distribution.ArchHs.Exception
import Distribution.ArchHs.Hackage
  ( getLatestCabal,
    getLatestSHA256,
  )
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Local (ignoreList)
import Distribution.ArchHs.Name
import Distribution.ArchHs.PkgBuild
  ( PkgBuild (..),
    mapLicense,
    showArchLicense,
  )
import Distribution.ArchHs.Types
import Distribution.ArchHs.Utils
import Distribution.Compiler (CompilerFlavor (..))
import Distribution.PackageDescription hiding (pkgName)
import Distribution.SPDX
import Distribution.System (Arch (X86_64), OS (Linux))
import qualified Distribution.Types.BuildInfo.Lens as L
import Distribution.Types.CondTree (simplifyCondTree)
import Distribution.Types.Dependency (Dependency)
import Distribution.Utils.ShortText (fromShortText)

archEnv :: Version -> FlagAssignment -> ConfVar -> Either ConfVar Bool
archEnv :: Version -> FlagAssignment -> ConfVar -> Either ConfVar Bool
archEnv Version
_ FlagAssignment
_ (OS OS
Linux) = Bool -> Either ConfVar Bool
forall a b. b -> Either a b
Right Bool
True
archEnv Version
_ FlagAssignment
_ (OS OS
_) = Bool -> Either ConfVar Bool
forall a b. b -> Either a b
Right Bool
False
archEnv Version
_ FlagAssignment
_ (Arch Arch
X86_64) = Bool -> Either ConfVar Bool
forall a b. b -> Either a b
Right Bool
True
archEnv Version
_ FlagAssignment
_ (Arch Arch
_) = Bool -> Either ConfVar Bool
forall a b. b -> Either a b
Right Bool
False
archEnv Version
ghcVersion FlagAssignment
_ (Impl CompilerFlavor
GHC VersionRange
range) = Bool -> Either ConfVar Bool
forall a b. b -> Either a b
Right (Bool -> Either ConfVar Bool) -> Bool -> Either ConfVar Bool
forall a b. (a -> b) -> a -> b
$ Version -> VersionRange -> Bool
withinRange Version
ghcVersion VersionRange
range
archEnv Version
_ FlagAssignment
_ (Impl CompilerFlavor
_ VersionRange
_) = Bool -> Either ConfVar Bool
forall a b. b -> Either a b
Right Bool
False
archEnv Version
_ FlagAssignment
assignment f :: ConfVar
f@(PkgFlag FlagName
f') = ConfVar -> Maybe Bool -> Either ConfVar Bool
forall a b. a -> Maybe b -> Either a b
go ConfVar
f (Maybe Bool -> Either ConfVar Bool)
-> Maybe Bool -> Either ConfVar Bool
forall a b. (a -> b) -> a -> b
$ FlagName -> FlagAssignment -> Maybe Bool
lookupFlagAssignment FlagName
f' FlagAssignment
assignment
  where
    go :: a -> Maybe b -> Either a b
go a
_ (Just b
r) = b -> Either a b
forall a b. b -> Either a b
Right b
r
    go a
x Maybe b
Nothing = a -> Either a b
forall a b. a -> Either a b
Left a
x

-- | Simplify the condition tree from 'GenericPackageDescription' with given flag assignments and archlinux system assumption.
evalConditionTree ::
  (HasCallStack, Semigroup k, L.HasBuildInfo k, Members [KnownGHCVersion, FlagAssignmentsEnv, Trace] r) =>
  GenericPackageDescription ->
  CondTree ConfVar [Dependency] k ->
  Sem r BuildInfo
evalConditionTree :: GenericPackageDescription
-> CondTree ConfVar [Dependency] k -> Sem r BuildInfo
evalConditionTree GenericPackageDescription
cabal CondTree ConfVar [Dependency] k
cond = do
  Map PackageName FlagAssignment
flagAssignments <- Sem r (Map PackageName FlagAssignment)
forall i (r :: [Effect]). MemberWithError (Reader i) r => Sem r i
ask
  let name :: PackageName
name = GenericPackageDescription -> PackageName
getPkgName' GenericPackageDescription
cabal
      packageFlags :: [Flag]
packageFlags = GenericPackageDescription -> [Flag]
genPackageFlags GenericPackageDescription
cabal
      defaultFlagAssignments :: FlagAssignment
defaultFlagAssignments =
        (Flag -> FlagAssignment -> FlagAssignment)
-> FlagAssignment -> [Flag] -> FlagAssignment
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\Flag
f FlagAssignment
acc -> FlagName -> Bool -> FlagAssignment -> FlagAssignment
insertFlagAssignment (Flag -> FlagName
flagName Flag
f) (Flag -> Bool
flagDefault Flag
f) FlagAssignment
acc) ([(FlagName, Bool)] -> FlagAssignment
mkFlagAssignment []) [Flag]
packageFlags
      flagAssignment :: [(FlagName, Bool)]
flagAssignment = case PackageName
-> Map PackageName FlagAssignment -> Maybe FlagAssignment
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup PackageName
name Map PackageName FlagAssignment
flagAssignments of
        Just FlagAssignment
f -> FlagAssignment -> [(FlagName, Bool)]
unFlagAssignment FlagAssignment
f
        Maybe FlagAssignment
_ -> []
      flagNames :: [FlagName]
flagNames = ((FlagName, Bool) -> FlagName) -> [(FlagName, Bool)] -> [FlagName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (FlagName, Bool) -> FlagName
forall a b. (a, b) -> a
fst [(FlagName, Bool)]
flagAssignment
      thisFlag :: FlagAssignment
thisFlag =
        [(FlagName, Bool)] -> FlagAssignment
mkFlagAssignment
          ([(FlagName, Bool)] -> FlagAssignment)
-> ([(FlagName, Bool)] -> [(FlagName, Bool)])
-> [(FlagName, Bool)]
-> FlagAssignment
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(FlagName, Bool)] -> [(FlagName, Bool)] -> [(FlagName, Bool)]
forall a. Semigroup a => a -> a -> a
<> [(FlagName, Bool)]
flagAssignment)
          ([(FlagName, Bool)] -> [(FlagName, Bool)])
-> ([(FlagName, Bool)] -> [(FlagName, Bool)])
-> [(FlagName, Bool)]
-> [(FlagName, Bool)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((FlagName, Bool) -> Bool)
-> [(FlagName, Bool)] -> [(FlagName, Bool)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(FlagName
fName, Bool
_) -> FlagName
fName FlagName -> [FlagName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [FlagName]
flagNames)
          ([(FlagName, Bool)] -> FlagAssignment)
-> [(FlagName, Bool)] -> FlagAssignment
forall a b. (a -> b) -> a -> b
$ FlagAssignment -> [(FlagName, Bool)]
unFlagAssignment FlagAssignment
defaultFlagAssignments
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Evaluating condition tree of " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> PackageName -> String
forall a. Show a => a -> String
show PackageName
name
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Flags: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> FlagAssignment -> String
forall a. Show a => a -> String
show FlagAssignment
thisFlag
  Sem r ()
forall (r :: [Effect]).
(HasCallStack, MemberWithError Trace r) =>
Sem r ()
traceCallStack
  Version
ghcVersion <- Sem r Version
forall i (r :: [Effect]). MemberWithError (Reader i) r => Sem r i
ask
  BuildInfo -> Sem r BuildInfo
forall (m :: * -> *) a. Monad m => a -> m a
return (BuildInfo -> Sem r BuildInfo) -> BuildInfo -> Sem r BuildInfo
forall a b. (a -> b) -> a -> b
$ (k -> Getting BuildInfo k BuildInfo -> BuildInfo
forall s a. s -> Getting a s a -> a
^. Getting BuildInfo k BuildInfo
forall a. HasBuildInfo a => Lens' a BuildInfo
L.buildInfo) (k -> BuildInfo)
-> (([Dependency], k) -> k) -> ([Dependency], k) -> BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Dependency], k) -> k
forall a b. (a, b) -> b
snd (([Dependency], k) -> BuildInfo) -> ([Dependency], k) -> BuildInfo
forall a b. (a -> b) -> a -> b
$ (ConfVar -> Either ConfVar Bool)
-> CondTree ConfVar [Dependency] k -> ([Dependency], k)
forall a d v.
(Semigroup a, Semigroup d) =>
(v -> Either v Bool) -> CondTree v d a -> (d, a)
simplifyCondTree (Version -> FlagAssignment -> ConfVar -> Either ConfVar Bool
archEnv Version
ghcVersion FlagAssignment
thisFlag) CondTree ConfVar [Dependency] k
cond

-----------------------------------------------------------------------------

-- | Get dependencies of a package recursively.
-- All version constraints will be discarded,
-- and only packages depended by executables, libraries, and test suits will be collected.
getDependencies ::
  (HasCallStack, Members [KnownGHCVersion, HackageEnv, FlagAssignmentsEnv, WithMyErr, DependencyRecord, State (Set PackageName), Trace] r) =>
  -- | Skipped
  [UnqualComponentName] ->
  -- | Parent
  Maybe PackageName ->
  -- | Target
  PackageName ->
  Sem r (G.AdjacencyMap (Set DependencyType) PackageName, Set PackageName, Map.Map PackageName [SystemDependency])
getDependencies :: [UnqualComponentName]
-> Maybe PackageName
-> PackageName
-> Sem
     r
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
getDependencies [UnqualComponentName]
skip Maybe PackageName
parent PackageName
name = do
  Set PackageName
resolved <- forall (r :: [Effect]).
MemberWithError (State (Set PackageName)) r =>
Sem r (Set PackageName)
forall s (r :: [Effect]). MemberWithError (State s) r => Sem r s
get @(Set PackageName)
  (Set PackageName -> Set PackageName) -> Sem r ()
forall s (r :: [Effect]).
Member (State s) r =>
(s -> s) -> Sem r ()
modify' ((Set PackageName -> Set PackageName) -> Sem r ())
-> (Set PackageName -> Set PackageName) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ PackageName -> Set PackageName -> Set PackageName
forall a. Ord a => a -> Set a -> Set a
Set.insert PackageName
name
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Getting all dependencies of (" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> PackageName -> String
forall a. Show a => a -> String
show PackageName
name String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"), parent: (" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Maybe PackageName -> String
forall a. Show a => a -> String
show Maybe PackageName
parent String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
")"
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Already resolved: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Set PackageName -> String
forall a. Show a => a -> String
show Set PackageName
resolved
  Sem r ()
forall (r :: [Effect]).
(HasCallStack, MemberWithError Trace r) =>
Sem r ()
traceCallStack
  GenericPackageDescription
cabal <- PackageName -> Sem r GenericPackageDescription
forall (r :: [Effect]).
Members '[HackageEnv, WithMyErr] r =>
PackageName -> Sem r GenericPackageDescription
getLatestCabal PackageName
name
  let kIgnoreVersionLib :: [(b, b)] -> [b]
kIgnoreVersionLib = ((b, b) -> b) -> [(b, b)] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, b) -> b
forall a b. (a, b) -> a
fst
      kIgnoreVersionComp :: [(a, [(b, b)])] -> [(a, [b])]
kIgnoreVersionComp = ((a, [(b, b)]) -> (a, [b])) -> [(a, [(b, b)])] -> [(a, [b])]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([(b, b)] -> [b]) -> (a, [(b, b)]) -> (a, [b])
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (([(b, b)] -> [b]) -> (a, [(b, b)]) -> (a, [b]))
-> ([(b, b)] -> [b]) -> (a, [(b, b)]) -> (a, [b])
forall a b. (a -> b) -> a -> b
$ ((b, b) -> b) -> [(b, b)] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, b) -> b
forall a b. (a, b) -> a
fst)
      kIgnoreVersionSetup :: [(PackageName, VersionRange)] -> [PackageName]
kIgnoreVersionSetup = [(PackageName, VersionRange)] -> [PackageName]
forall b b. [(b, b)] -> [b]
kIgnoreVersionLib
  ([PackageName]
libDeps, [PackageName]
libToolsDeps, [SystemDependency]
libSysDeps) <- ([(PackageName, VersionRange)] -> [PackageName])
-> GenericPackageDescription
-> Sem r ([PackageName], [PackageName], [SystemDependency])
forall (r :: [Effect]) a.
(Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a, Monoid a) =>
([(PackageName, VersionRange)] -> a)
-> GenericPackageDescription -> Sem r (a, a, [SystemDependency])
collectLibDeps [(PackageName, VersionRange)] -> [PackageName]
forall b b. [(b, b)] -> [b]
kIgnoreVersionLib GenericPackageDescription
cabal
  ([(UnqualComponentName, [PackageName])]
subLibDeps, [(UnqualComponentName, [PackageName])]
subLibToolsDeps, [SystemDependency]
subLibSysDeps) <- ([(UnqualComponentName, [(PackageName, VersionRange)])]
 -> [(UnqualComponentName, [PackageName])])
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem
     r
     ([(UnqualComponentName, [PackageName])],
      [(UnqualComponentName, [PackageName])], [SystemDependency])
forall (r :: [Effect]) a.
(HasCallStack,
 Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a) =>
([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectSubLibDeps [(UnqualComponentName, [(PackageName, VersionRange)])]
-> [(UnqualComponentName, [PackageName])]
forall a b b. [(a, [(b, b)])] -> [(a, [b])]
kIgnoreVersionComp GenericPackageDescription
cabal [UnqualComponentName]
skip
  ([(UnqualComponentName, [PackageName])]
exeDeps, [(UnqualComponentName, [PackageName])]
exeToolsDeps, [SystemDependency]
exeSysDeps) <- ([(UnqualComponentName, [(PackageName, VersionRange)])]
 -> [(UnqualComponentName, [PackageName])])
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem
     r
     ([(UnqualComponentName, [PackageName])],
      [(UnqualComponentName, [PackageName])], [SystemDependency])
forall (r :: [Effect]) a.
(HasCallStack,
 Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a) =>
([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectExeDeps [(UnqualComponentName, [(PackageName, VersionRange)])]
-> [(UnqualComponentName, [PackageName])]
forall a b b. [(a, [(b, b)])] -> [(a, [b])]
kIgnoreVersionComp GenericPackageDescription
cabal [UnqualComponentName]
skip
  ([(UnqualComponentName, [PackageName])]
testDeps, [(UnqualComponentName, [PackageName])]
testToolsDeps, [SystemDependency]
testSysDeps) <- ([(UnqualComponentName, [(PackageName, VersionRange)])]
 -> [(UnqualComponentName, [PackageName])])
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem
     r
     ([(UnqualComponentName, [PackageName])],
      [(UnqualComponentName, [PackageName])], [SystemDependency])
forall (r :: [Effect]) a.
(HasCallStack,
 Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a) =>
([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectTestDeps [(UnqualComponentName, [(PackageName, VersionRange)])]
-> [(UnqualComponentName, [PackageName])]
forall a b b. [(a, [(b, b)])] -> [(a, [b])]
kIgnoreVersionComp GenericPackageDescription
cabal [UnqualComponentName]
skip
  [PackageName]
setupDeps <- ([(PackageName, VersionRange)] -> [PackageName])
-> GenericPackageDescription -> Sem r [PackageName]
forall (r :: [Effect]) a.
(Member Trace r, Show a, Monoid a) =>
([(PackageName, VersionRange)] -> a)
-> GenericPackageDescription -> Sem r a
collectSetupDeps [(PackageName, VersionRange)] -> [PackageName]
kIgnoreVersionSetup GenericPackageDescription
cabal
  -- Ignore benchmarks
  -- (benchDeps, benchToolsDeps) <- collectBenchMarkDeps cabal skip
  let uname :: (UnqualComponentName -> DependencyType) -> ComponentPkgList -> [(DependencyType, PkgList)]
      uname :: (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, [PackageName])]
uname UnqualComponentName -> DependencyType
cons [(UnqualComponentName, [PackageName])]
list = [DependencyType]
-> [[PackageName]] -> [(DependencyType, [PackageName])]
forall a b. [a] -> [b] -> [(a, b)]
zip (((UnqualComponentName, [PackageName]) -> DependencyType)
-> [(UnqualComponentName, [PackageName])] -> [DependencyType]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (UnqualComponentName -> DependencyType
cons (UnqualComponentName -> DependencyType)
-> ((UnqualComponentName, [PackageName]) -> UnqualComponentName)
-> (UnqualComponentName, [PackageName])
-> DependencyType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, [PackageName]) -> UnqualComponentName
forall a b. (a, b) -> a
fst) [(UnqualComponentName, [PackageName])]
list) (((UnqualComponentName, [PackageName]) -> [PackageName])
-> [(UnqualComponentName, [PackageName])] -> [[PackageName]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (UnqualComponentName, [PackageName]) -> [PackageName]
forall a b. (a, b) -> b
snd [(UnqualComponentName, [PackageName])]
list)

      flatten :: [(DependencyType, PkgList)] -> [(DependencyType, PackageName)]
      flatten :: [(DependencyType, [PackageName])]
-> [(DependencyType, PackageName)]
flatten = [[(DependencyType, PackageName)]]
-> [(DependencyType, PackageName)]
forall a. Monoid a => [a] -> a
mconcat ([[(DependencyType, PackageName)]]
 -> [(DependencyType, PackageName)])
-> ([(DependencyType, [PackageName])]
    -> [[(DependencyType, PackageName)]])
-> [(DependencyType, [PackageName])]
-> [(DependencyType, PackageName)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((DependencyType, [PackageName])
 -> [(DependencyType, PackageName)])
-> [(DependencyType, [PackageName])]
-> [[(DependencyType, PackageName)]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(DependencyType
t, [PackageName]
pkgs) -> [DependencyType]
-> [PackageName] -> [(DependencyType, PackageName)]
forall a b. [a] -> [b] -> [(a, b)]
zip (DependencyType -> [DependencyType]
forall a. a -> [a]
repeat DependencyType
t) [PackageName]
pkgs)

      withThisName :: [(DependencyType, PackageName)] -> [(DependencyType, PackageName, PackageName)]
      withThisName :: [(DependencyType, PackageName)]
-> [(DependencyType, PackageName, PackageName)]
withThisName = ((DependencyType, PackageName)
 -> (DependencyType, PackageName, PackageName))
-> [(DependencyType, PackageName)]
-> [(DependencyType, PackageName, PackageName)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(DependencyType
t, PackageName
pkg) -> (DependencyType
t, PackageName
name, PackageName
pkg))

      ignoreSingle :: PackageName -> Bool
ignoreSingle PackageName
x = PackageName
x PackageName -> [PackageName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [PackageName]
ignoreList
      ignore :: [PackageName] -> [PackageName]
ignore = (PackageName -> Bool) -> [PackageName] -> [PackageName]
forall a. (a -> Bool) -> [a] -> [a]
filter PackageName -> Bool
ignoreSingle
      ignoreFlatten :: (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
k = ((DependencyType, PackageName) -> Bool)
-> [(DependencyType, PackageName)]
-> [(DependencyType, PackageName)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(DependencyType
_, PackageName
x) -> PackageName -> Bool
ignoreSingle PackageName
x) ([(DependencyType, PackageName)]
 -> [(DependencyType, PackageName)])
-> ([(UnqualComponentName, [PackageName])]
    -> [(DependencyType, PackageName)])
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(DependencyType, [PackageName])]
-> [(DependencyType, PackageName)]
flatten ([(DependencyType, [PackageName])]
 -> [(DependencyType, PackageName)])
-> ([(UnqualComponentName, [PackageName])]
    -> [(DependencyType, [PackageName])])
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, [PackageName])]
uname UnqualComponentName -> DependencyType
k

      filteredLibDeps :: [PackageName]
filteredLibDeps = [PackageName] -> [PackageName]
ignore [PackageName]
libDeps
      filteredLibToolsDeps :: [PackageName]
filteredLibToolsDeps = [PackageName] -> [PackageName]
ignore [PackageName]
libToolsDeps
      filteredExeDeps :: [(DependencyType, PackageName)]
filteredExeDeps = (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
CExe [(UnqualComponentName, [PackageName])]
exeDeps
      filteredExeToolsDeps :: [(DependencyType, PackageName)]
filteredExeToolsDeps = (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
CExeBuildTools [(UnqualComponentName, [PackageName])]
exeToolsDeps
      filteredTestDeps :: [(DependencyType, PackageName)]
filteredTestDeps = (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
CTest [(UnqualComponentName, [PackageName])]
testDeps
      filteredTestToolsDeps :: [(DependencyType, PackageName)]
filteredTestToolsDeps = (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
CTest [(UnqualComponentName, [PackageName])]
testToolsDeps
      filteredSubLibDeps :: [(DependencyType, PackageName)]
filteredSubLibDeps = (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
CSubLibs [(UnqualComponentName, [PackageName])]
subLibDeps
      filteredSubLibToolsDeps :: [(DependencyType, PackageName)]
filteredSubLibToolsDeps = (UnqualComponentName -> DependencyType)
-> [(UnqualComponentName, [PackageName])]
-> [(DependencyType, PackageName)]
ignoreFlatten UnqualComponentName -> DependencyType
CSubLibsBuildTools [(UnqualComponentName, [PackageName])]
subLibToolsDeps
      filteredSetupDeps :: [PackageName]
filteredSetupDeps = [PackageName] -> [PackageName]
ignore [PackageName]
setupDeps

      filteredSubLibDepsNames :: [PackageName]
filteredSubLibDepsNames = ((UnqualComponentName, [PackageName]) -> PackageName)
-> [(UnqualComponentName, [PackageName])] -> [PackageName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (UnqualComponentName -> PackageName
unqualComponentNameToPackageName (UnqualComponentName -> PackageName)
-> ((UnqualComponentName, [PackageName]) -> UnqualComponentName)
-> (UnqualComponentName, [PackageName])
-> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, [PackageName]) -> UnqualComponentName
forall a b. (a, b) -> a
fst) [(UnqualComponentName, [PackageName])]
subLibDeps
      ignoreSubLibs :: [PackageName] -> [PackageName]
ignoreSubLibs = (PackageName -> Bool) -> [PackageName] -> [PackageName]
forall a. (a -> Bool) -> [a] -> [a]
filter (PackageName -> [PackageName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [PackageName]
filteredSubLibDepsNames)
      ignoreResolved :: [PackageName] -> [PackageName]
ignoreResolved = (PackageName -> Bool) -> [PackageName] -> [PackageName]
forall a. (a -> Bool) -> [a] -> [a]
filter (PackageName -> Set PackageName -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` Set PackageName
resolved)

      currentLib :: AdjacencyMap (Set DependencyType) PackageName
currentLib = [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall e a.
(Eq e, Monoid e, Ord a) =>
[(e, a, a)] -> AdjacencyMap e a
G.edges ([(Set DependencyType, PackageName, PackageName)]
 -> AdjacencyMap (Set DependencyType) PackageName)
-> [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall a b. (a -> b) -> a -> b
$ [Set DependencyType]
-> [PackageName]
-> [PackageName]
-> [(Set DependencyType, PackageName, PackageName)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 (Set DependencyType -> [Set DependencyType]
forall a. a -> [a]
repeat (Set DependencyType -> [Set DependencyType])
-> Set DependencyType -> [Set DependencyType]
forall a b. (a -> b) -> a -> b
$ DependencyType -> Set DependencyType
forall a. a -> Set a
Set.singleton DependencyType
CLib) (PackageName -> [PackageName]
forall a. a -> [a]
repeat PackageName
name) [PackageName]
filteredLibDeps
      currentLibToolDeps :: AdjacencyMap (Set DependencyType) PackageName
currentLibToolDeps = [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall e a.
(Eq e, Monoid e, Ord a) =>
[(e, a, a)] -> AdjacencyMap e a
G.edges ([(Set DependencyType, PackageName, PackageName)]
 -> AdjacencyMap (Set DependencyType) PackageName)
-> [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall a b. (a -> b) -> a -> b
$ [Set DependencyType]
-> [PackageName]
-> [PackageName]
-> [(Set DependencyType, PackageName, PackageName)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 (Set DependencyType -> [Set DependencyType]
forall a. a -> [a]
repeat (Set DependencyType -> [Set DependencyType])
-> Set DependencyType -> [Set DependencyType]
forall a b. (a -> b) -> a -> b
$ DependencyType -> Set DependencyType
forall a. a -> Set a
Set.singleton DependencyType
CLibBuildTools) (PackageName -> [PackageName]
forall a. a -> [a]
repeat PackageName
name) [PackageName]
filteredLibToolsDeps
      currentSetupDeps :: AdjacencyMap (Set DependencyType) PackageName
currentSetupDeps = [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall e a.
(Eq e, Monoid e, Ord a) =>
[(e, a, a)] -> AdjacencyMap e a
G.edges ([(Set DependencyType, PackageName, PackageName)]
 -> AdjacencyMap (Set DependencyType) PackageName)
-> [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall a b. (a -> b) -> a -> b
$ [Set DependencyType]
-> [PackageName]
-> [PackageName]
-> [(Set DependencyType, PackageName, PackageName)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 (Set DependencyType -> [Set DependencyType]
forall a. a -> [a]
repeat (Set DependencyType -> [Set DependencyType])
-> Set DependencyType -> [Set DependencyType]
forall a b. (a -> b) -> a -> b
$ DependencyType -> Set DependencyType
forall a. a -> Set a
Set.singleton DependencyType
CSetup) (PackageName -> [PackageName]
forall a. a -> [a]
repeat PackageName
name) [PackageName]
filteredSetupDeps

      componentialEdges :: [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges =
        [(Set DependencyType, PackageName, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall e a.
(Eq e, Monoid e, Ord a) =>
[(e, a, a)] -> AdjacencyMap e a
G.edges
          ([(Set DependencyType, PackageName, PackageName)]
 -> AdjacencyMap (Set DependencyType) PackageName)
-> ([(DependencyType, PackageName)]
    -> [(Set DependencyType, PackageName, PackageName)])
-> [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((DependencyType, PackageName, PackageName)
 -> (Set DependencyType, PackageName, PackageName))
-> [(DependencyType, PackageName, PackageName)]
-> [(Set DependencyType, PackageName, PackageName)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(DependencyType
x, PackageName
y, PackageName
z) -> (DependencyType -> Set DependencyType
forall a. a -> Set a
Set.singleton DependencyType
x, PackageName
y, PackageName
z))
          ([(DependencyType, PackageName, PackageName)]
 -> [(Set DependencyType, PackageName, PackageName)])
-> ([(DependencyType, PackageName)]
    -> [(DependencyType, PackageName, PackageName)])
-> [(DependencyType, PackageName)]
-> [(Set DependencyType, PackageName, PackageName)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(DependencyType, PackageName)]
-> [(DependencyType, PackageName, PackageName)]
withThisName

      currentSubLibs :: AdjacencyMap (Set DependencyType) PackageName
currentSubLibs = [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges [(DependencyType, PackageName)]
filteredSubLibDeps
      currentSubLibsTools :: AdjacencyMap (Set DependencyType) PackageName
currentSubLibsTools = [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges [(DependencyType, PackageName)]
filteredSubLibToolsDeps
      currentExe :: AdjacencyMap (Set DependencyType) PackageName
currentExe = [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges [(DependencyType, PackageName)]
filteredExeDeps
      currentExeTools :: AdjacencyMap (Set DependencyType) PackageName
currentExeTools = [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges [(DependencyType, PackageName)]
filteredExeToolsDeps
      currentTest :: AdjacencyMap (Set DependencyType) PackageName
currentTest = [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges [(DependencyType, PackageName)]
filteredTestDeps
      currentTestTools :: AdjacencyMap (Set DependencyType) PackageName
currentTestTools = [(DependencyType, PackageName)]
-> AdjacencyMap (Set DependencyType) PackageName
componentialEdges [(DependencyType, PackageName)]
filteredTestToolsDeps

      -- currentBench = componentialEdges Types.Benchmark benchDeps
      -- currentBenchTools = componentialEdges BenchmarkBuildTools benchToolsDeps

      currentSysDeps :: [SystemDependency]
currentSysDeps = [SystemDependency] -> [SystemDependency]
forall a. Ord a => [a] -> [a]
nubOrd ([SystemDependency] -> [SystemDependency])
-> [SystemDependency] -> [SystemDependency]
forall a b. (a -> b) -> a -> b
$ [SystemDependency]
libSysDeps [SystemDependency] -> [SystemDependency] -> [SystemDependency]
forall a. Semigroup a => a -> a -> a
<> [SystemDependency]
subLibSysDeps [SystemDependency] -> [SystemDependency] -> [SystemDependency]
forall a. Semigroup a => a -> a -> a
<> [SystemDependency]
exeSysDeps [SystemDependency] -> [SystemDependency] -> [SystemDependency]
forall a. Semigroup a => a -> a -> a
<> [SystemDependency]
testSysDeps
      processNext :: [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
processNext = (PackageName
 -> Sem
      r
      (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency]))
-> [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ([UnqualComponentName]
-> Maybe PackageName
-> PackageName
-> Sem
     r
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
forall (r :: [Effect]).
(HasCallStack,
 Members
   '[KnownGHCVersion, HackageEnv, FlagAssignmentsEnv, WithMyErr,
     DependencyRecord, State (Set PackageName), Trace]
   r) =>
[UnqualComponentName]
-> Maybe PackageName
-> PackageName
-> Sem
     r
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
getDependencies [UnqualComponentName]
skip (PackageName -> Maybe PackageName
forall a. a -> Maybe a
Just PackageName
name)) ([PackageName]
 -> Sem
      r
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> ([PackageName] -> [PackageName])
-> [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PackageName] -> [PackageName]
ignoreResolved ([PackageName] -> [PackageName])
-> ([PackageName] -> [PackageName])
-> [PackageName]
-> [PackageName]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PackageName] -> [PackageName]
ignoreSubLibs
      <+> :: AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
(<+>) = AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
forall e a.
(Eq e, Monoid e, Ord a) =>
AdjacencyMap e a -> AdjacencyMap e a -> AdjacencyMap e a
G.overlay
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextLib <- [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
processNext [PackageName]
filteredLibDeps
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextSetup <- [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
processNext [PackageName]
filteredSetupDeps
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextExe <- [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
processNext ([PackageName]
 -> Sem
      r
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall a b. (a -> b) -> a -> b
$ ((DependencyType, PackageName) -> PackageName)
-> [(DependencyType, PackageName)] -> [PackageName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (DependencyType, PackageName) -> PackageName
forall a b. (a, b) -> b
snd [(DependencyType, PackageName)]
filteredExeDeps
  -- TODO: maybe unstable
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextTest <- [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
processNext ([PackageName]
 -> Sem
      r
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall a b. (a -> b) -> a -> b
$ ((DependencyType, PackageName) -> PackageName)
-> [(DependencyType, PackageName)] -> [PackageName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (DependencyType, PackageName) -> PackageName
forall a b. (a, b) -> b
snd [(DependencyType, PackageName)]
filteredTestDeps
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextSubLibs <- (PackageName
 -> Sem
      r
      (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency]))
-> [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ([UnqualComponentName]
-> Maybe PackageName
-> PackageName
-> Sem
     r
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
forall (r :: [Effect]).
(HasCallStack,
 Members
   '[KnownGHCVersion, HackageEnv, FlagAssignmentsEnv, WithMyErr,
     DependencyRecord, State (Set PackageName), Trace]
   r) =>
[UnqualComponentName]
-> Maybe PackageName
-> PackageName
-> Sem
     r
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
getDependencies [UnqualComponentName]
skip (PackageName -> Maybe PackageName
forall a. a -> Maybe a
Just PackageName
name)) ([PackageName]
 -> Sem
      r
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> [PackageName]
-> Sem
     r
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall a b. (a -> b) -> a -> b
$ ((DependencyType, PackageName) -> PackageName)
-> [(DependencyType, PackageName)] -> [PackageName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (DependencyType, PackageName) -> PackageName
forall a b. (a, b) -> b
snd [(DependencyType, PackageName)]
filteredSubLibDeps
  let temp :: [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
temp = [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextLib, [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextSetup, [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextExe, [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextTest, [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
nextSubLibs]
      nexts :: AdjacencyMap (Set DependencyType) PackageName
nexts = [AdjacencyMap (Set DependencyType) PackageName]
-> AdjacencyMap (Set DependencyType) PackageName
forall e a.
(Eq e, Monoid e, Ord a) =>
[AdjacencyMap e a] -> AdjacencyMap e a
G.overlays ([AdjacencyMap (Set DependencyType) PackageName]
 -> AdjacencyMap (Set DependencyType) PackageName)
-> [AdjacencyMap (Set DependencyType) PackageName]
-> AdjacencyMap (Set DependencyType) PackageName
forall a b. (a -> b) -> a -> b
$ [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
temp [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
-> Getting
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])]]
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
-> [(AdjacencyMap (Set DependencyType) PackageName,
     Set PackageName, Map PackageName [SystemDependency])]
forall s a. s -> Getting a s a -> a
^. Getting
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])]
  [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
     Map PackageName [SystemDependency])]]
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])]
forall s t a b. Each s t a b => Traversal s t a b
each [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
-> Getting
     (Endo [AdjacencyMap (Set DependencyType) PackageName])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     (AdjacencyMap (Set DependencyType) PackageName)
-> [AdjacencyMap (Set DependencyType) PackageName]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])
 -> Const
      (Endo [AdjacencyMap (Set DependencyType) PackageName])
      (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency]))
-> [(AdjacencyMap (Set DependencyType) PackageName,
     Set PackageName, Map PackageName [SystemDependency])]
-> Const
     (Endo [AdjacencyMap (Set DependencyType) PackageName])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall s t a b. Each s t a b => Traversal s t a b
each (((AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])
  -> Const
       (Endo [AdjacencyMap (Set DependencyType) PackageName])
       (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency]))
 -> [(AdjacencyMap (Set DependencyType) PackageName,
      Set PackageName, Map PackageName [SystemDependency])]
 -> Const
      (Endo [AdjacencyMap (Set DependencyType) PackageName])
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> ((AdjacencyMap (Set DependencyType) PackageName
     -> Const
          (Endo [AdjacencyMap (Set DependencyType) PackageName])
          (AdjacencyMap (Set DependencyType) PackageName))
    -> (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])
    -> Const
         (Endo [AdjacencyMap (Set DependencyType) PackageName])
         (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
          Map PackageName [SystemDependency]))
-> Getting
     (Endo [AdjacencyMap (Set DependencyType) PackageName])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     (AdjacencyMap (Set DependencyType) PackageName)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AdjacencyMap (Set DependencyType) PackageName
 -> Const
      (Endo [AdjacencyMap (Set DependencyType) PackageName])
      (AdjacencyMap (Set DependencyType) PackageName))
-> (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])
-> Const
     (Endo [AdjacencyMap (Set DependencyType) PackageName])
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
forall s t a b. Field1 s t a b => Lens s t a b
_1
      subsubs :: Set PackageName
subsubs = [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
temp [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
-> Getting
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])]]
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
-> [(AdjacencyMap (Set DependencyType) PackageName,
     Set PackageName, Map PackageName [SystemDependency])]
forall s a. s -> Getting a s a -> a
^. Getting
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])]
  [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
     Map PackageName [SystemDependency])]]
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])]
forall s t a b. Each s t a b => Traversal s t a b
each [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
-> Getting
     (Endo [Set PackageName])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     (Set PackageName)
-> [Set PackageName]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])
 -> Const
      (Endo [Set PackageName])
      (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency]))
-> [(AdjacencyMap (Set DependencyType) PackageName,
     Set PackageName, Map PackageName [SystemDependency])]
-> Const
     (Endo [Set PackageName])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall s t a b. Each s t a b => Traversal s t a b
each (((AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])
  -> Const
       (Endo [Set PackageName])
       (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency]))
 -> [(AdjacencyMap (Set DependencyType) PackageName,
      Set PackageName, Map PackageName [SystemDependency])]
 -> Const
      (Endo [Set PackageName])
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> ((Set PackageName
     -> Const (Endo [Set PackageName]) (Set PackageName))
    -> (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])
    -> Const
         (Endo [Set PackageName])
         (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
          Map PackageName [SystemDependency]))
-> Getting
     (Endo [Set PackageName])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     (Set PackageName)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set PackageName
 -> Const (Endo [Set PackageName]) (Set PackageName))
-> (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])
-> Const
     (Endo [Set PackageName])
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
forall s t a b. Field2 s t a b => Lens s t a b
_2 [Set PackageName]
-> Getting (Set PackageName) [Set PackageName] (Set PackageName)
-> Set PackageName
forall s a. s -> Getting a s a -> a
^. Getting (Set PackageName) [Set PackageName] (Set PackageName)
forall s t a b. Each s t a b => Traversal s t a b
each
      nextSys :: Map PackageName [SystemDependency]
nextSys = [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
temp [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])]]
-> Getting
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])]]
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
-> [(AdjacencyMap (Set DependencyType) PackageName,
     Set PackageName, Map PackageName [SystemDependency])]
forall s a. s -> Getting a s a -> a
^. Getting
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])]
  [[(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
     Map PackageName [SystemDependency])]]
  [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])]
forall s t a b. Each s t a b => Traversal s t a b
each [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])]
-> Getting
     (Endo [Map PackageName [SystemDependency]])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     (Map PackageName [SystemDependency])
-> [Map PackageName [SystemDependency]]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
  Map PackageName [SystemDependency])
 -> Const
      (Endo [Map PackageName [SystemDependency]])
      (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency]))
-> [(AdjacencyMap (Set DependencyType) PackageName,
     Set PackageName, Map PackageName [SystemDependency])]
-> Const
     (Endo [Map PackageName [SystemDependency]])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
forall s t a b. Each s t a b => Traversal s t a b
each (((AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
   Map PackageName [SystemDependency])
  -> Const
       (Endo [Map PackageName [SystemDependency]])
       (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency]))
 -> [(AdjacencyMap (Set DependencyType) PackageName,
      Set PackageName, Map PackageName [SystemDependency])]
 -> Const
      (Endo [Map PackageName [SystemDependency]])
      [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])])
-> ((Map PackageName [SystemDependency]
     -> Const
          (Endo [Map PackageName [SystemDependency]])
          (Map PackageName [SystemDependency]))
    -> (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
        Map PackageName [SystemDependency])
    -> Const
         (Endo [Map PackageName [SystemDependency]])
         (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
          Map PackageName [SystemDependency]))
-> Getting
     (Endo [Map PackageName [SystemDependency]])
     [(AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
       Map PackageName [SystemDependency])]
     (Map PackageName [SystemDependency])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Map PackageName [SystemDependency]
 -> Const
      (Endo [Map PackageName [SystemDependency]])
      (Map PackageName [SystemDependency]))
-> (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
    Map PackageName [SystemDependency])
-> Const
     (Endo [Map PackageName [SystemDependency]])
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
forall s t a b. Field3 s t a b => Lens s t a b
_3 [Map PackageName [SystemDependency]]
-> Getting
     (Map PackageName [SystemDependency])
     [Map PackageName [SystemDependency]]
     (Map PackageName [SystemDependency])
-> Map PackageName [SystemDependency]
forall s a. s -> Getting a s a -> a
^. Getting
  (Map PackageName [SystemDependency])
  [Map PackageName [SystemDependency]]
  (Map PackageName [SystemDependency])
forall s t a b. Each s t a b => Traversal s t a b
each
  (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
 Map PackageName [SystemDependency])
-> Sem
     r
     (AdjacencyMap (Set DependencyType) PackageName, Set PackageName,
      Map PackageName [SystemDependency])
forall (m :: * -> *) a. Monad m => a -> m a
return
    ( AdjacencyMap (Set DependencyType) PackageName
currentLib
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentLibToolDeps
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentSetupDeps
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentExe
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentExeTools
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentTest
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentTestTools
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentSubLibs
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
currentSubLibsTools
        -- <+> currentBench
        -- <+> currentBenchTools
        AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
-> AdjacencyMap (Set DependencyType) PackageName
<+> AdjacencyMap (Set DependencyType) PackageName
nexts,
      [PackageName] -> Set PackageName
forall a. Ord a => [a] -> Set a
Set.fromList [PackageName]
filteredSubLibDepsNames Set PackageName -> Set PackageName -> Set PackageName
forall a. Semigroup a => a -> a -> a
<> Set PackageName
subsubs,
      (if [SystemDependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SystemDependency]
currentSysDeps then Map PackageName [SystemDependency]
forall k a. Map k a
Map.empty else PackageName
-> [SystemDependency] -> Map PackageName [SystemDependency]
forall k a. k -> a -> Map k a
Map.singleton PackageName
name [SystemDependency]
currentSysDeps) Map PackageName [SystemDependency]
-> Map PackageName [SystemDependency]
-> Map PackageName [SystemDependency]
forall a. Semigroup a => a -> a -> a
<> Map PackageName [SystemDependency]
nextSys
    )

collectLibDeps ::
  (Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a, Monoid a) =>
  ([(PackageName, VersionRange)] -> a) ->
  GenericPackageDescription ->
  Sem r (a, a, [SystemDependency])
collectLibDeps :: ([(PackageName, VersionRange)] -> a)
-> GenericPackageDescription -> Sem r (a, a, [SystemDependency])
collectLibDeps [(PackageName, VersionRange)] -> a
k GenericPackageDescription
cabal = do
  case GenericPackageDescription
cabal GenericPackageDescription
-> (GenericPackageDescription
    -> Maybe (CondTree ConfVar [Dependency] Library))
-> Maybe (CondTree ConfVar [Dependency] Library)
forall a b. a -> (a -> b) -> b
& GenericPackageDescription
-> Maybe (CondTree ConfVar [Dependency] Library)
condLibrary of
    Just CondTree ConfVar [Dependency] Library
lib -> do
      let name :: PackageName
name = GenericPackageDescription -> PackageName
getPkgName' GenericPackageDescription
cabal
      String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Getting libs dependencies of " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> PackageName -> String
forall a. Show a => a -> String
show PackageName
name
      BuildInfo
info <- GenericPackageDescription
-> CondTree ConfVar [Dependency] Library -> Sem r BuildInfo
forall k (r :: [Effect]).
(HasCallStack, Semigroup k, HasBuildInfo k,
 Members '[KnownGHCVersion, FlagAssignmentsEnv, Trace] r) =>
GenericPackageDescription
-> CondTree ConfVar [Dependency] k -> Sem r BuildInfo
evalConditionTree GenericPackageDescription
cabal CondTree ConfVar [Dependency] Library
lib
      let libDeps :: [(PackageName, VersionRange)]
libDeps = Dependency -> (PackageName, VersionRange)
unDepV (Dependency -> (PackageName, VersionRange))
-> [Dependency] -> [(PackageName, VersionRange)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuildInfo -> [Dependency]
buildDependsIfBuild BuildInfo
info
          toolDeps :: [(PackageName, VersionRange)]
toolDeps = ([LegacyExeDependency], [ExeDependency])
-> [(PackageName, VersionRange)]
unBuildTools (([LegacyExeDependency], [ExeDependency])
 -> [(PackageName, VersionRange)])
-> ([LegacyExeDependency], [ExeDependency])
-> [(PackageName, VersionRange)]
forall a b. (a -> b) -> a -> b
$ BuildInfo -> ([LegacyExeDependency], [ExeDependency])
buildToolsAndbuildToolDependsIfBuild BuildInfo
info
          systemDeps :: [SystemDependency]
systemDeps = ([PkgconfigDependency], [String]) -> [SystemDependency]
unSystemDependency (([PkgconfigDependency], [String]) -> [SystemDependency])
-> ([PkgconfigDependency], [String]) -> [SystemDependency]
forall a b. (a -> b) -> a -> b
$ BuildInfo -> ([PkgconfigDependency], [String])
pkgconfigDependsAndExtraLibsIfBuild BuildInfo
info
      ((PackageName, VersionRange) -> Sem r ())
-> [(PackageName, VersionRange)] -> Sem r ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((PackageName -> VersionRange -> Sem r ())
-> (PackageName, VersionRange) -> Sem r ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> VersionRange -> Sem r ()
forall (r :: [Effect]).
Member DependencyRecord r =>
PackageName -> VersionRange -> Sem r ()
updateDependencyRecord) [(PackageName, VersionRange)]
libDeps
      ((PackageName, VersionRange) -> Sem r ())
-> [(PackageName, VersionRange)] -> Sem r ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((PackageName -> VersionRange -> Sem r ())
-> (PackageName, VersionRange) -> Sem r ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> VersionRange -> Sem r ()
forall (r :: [Effect]).
Member DependencyRecord r =>
PackageName -> VersionRange -> Sem r ()
updateDependencyRecord) [(PackageName, VersionRange)]
toolDeps
      let result :: (a, a, [SystemDependency])
result = ([(PackageName, VersionRange)] -> a
k [(PackageName, VersionRange)]
libDeps, [(PackageName, VersionRange)] -> a
k [(PackageName, VersionRange)]
toolDeps, [SystemDependency]
systemDeps)
      String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Found: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (a, a, [SystemDependency]) -> String
forall a. Show a => a -> String
show (a, a, [SystemDependency])
result
      Sem r ()
forall (r :: [Effect]).
(HasCallStack, MemberWithError Trace r) =>
Sem r ()
traceCallStack
      (a, a, [SystemDependency]) -> Sem r (a, a, [SystemDependency])
forall (m :: * -> *) a. Monad m => a -> m a
return (a, a, [SystemDependency])
result
    Maybe (CondTree ConfVar [Dependency] Library)
Nothing -> (a, a, [SystemDependency]) -> Sem r (a, a, [SystemDependency])
forall (m :: * -> *) a. Monad m => a -> m a
return (a, a, [SystemDependency])
forall a. Monoid a => a
mempty -- 'Monoid a' comes from here

collectComponentialDeps ::
  (HasCallStack, Semigroup k, L.HasBuildInfo k, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>
  String ->
  (GenericPackageDescription -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]) ->
  ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->
  GenericPackageDescription ->
  [UnqualComponentName] ->
  Sem r (a, a, [SystemDependency])
collectComponentialDeps :: String
-> (GenericPackageDescription
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectComponentialDeps String
tag GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
f [(UnqualComponentName, [(PackageName, VersionRange)])] -> a
k GenericPackageDescription
cabal [UnqualComponentName]
skip = do
  let conds :: [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
conds = GenericPackageDescription
cabal GenericPackageDescription
-> (GenericPackageDescription
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
forall a b. a -> (a -> b) -> b
& GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
f
      name :: PackageName
name = GenericPackageDescription -> PackageName
getPkgName' GenericPackageDescription
cabal
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Getting " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
tag String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" dependencies of " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> PackageName -> String
forall a. Show a => a -> String
show PackageName
name
  [(UnqualComponentName, BuildInfo)]
info <- ((UnqualComponentName, BuildInfo) -> Bool)
-> [(UnqualComponentName, BuildInfo)]
-> [(UnqualComponentName, BuildInfo)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> ((UnqualComponentName, BuildInfo) -> Bool)
-> (UnqualComponentName, BuildInfo)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName -> [UnqualComponentName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [UnqualComponentName]
skip) (UnqualComponentName -> Bool)
-> ((UnqualComponentName, BuildInfo) -> UnqualComponentName)
-> (UnqualComponentName, BuildInfo)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, BuildInfo) -> UnqualComponentName
forall a b. (a, b) -> a
fst) ([(UnqualComponentName, BuildInfo)]
 -> [(UnqualComponentName, BuildInfo)])
-> ([BuildInfo] -> [(UnqualComponentName, BuildInfo)])
-> [BuildInfo]
-> [(UnqualComponentName, BuildInfo)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [UnqualComponentName]
-> [BuildInfo] -> [(UnqualComponentName, BuildInfo)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([(UnqualComponentName, CondTree ConfVar [Dependency] k)]
conds [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
-> ((UnqualComponentName, CondTree ConfVar [Dependency] k)
    -> UnqualComponentName)
-> [UnqualComponentName]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (UnqualComponentName, CondTree ConfVar [Dependency] k)
-> UnqualComponentName
forall a b. (a, b) -> a
fst) ([BuildInfo] -> [(UnqualComponentName, BuildInfo)])
-> Sem r [BuildInfo] -> Sem r [(UnqualComponentName, BuildInfo)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((UnqualComponentName, CondTree ConfVar [Dependency] k)
 -> Sem r BuildInfo)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
-> Sem r [BuildInfo]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (GenericPackageDescription
-> CondTree ConfVar [Dependency] k -> Sem r BuildInfo
forall k (r :: [Effect]).
(HasCallStack, Semigroup k, HasBuildInfo k,
 Members '[KnownGHCVersion, FlagAssignmentsEnv, Trace] r) =>
GenericPackageDescription
-> CondTree ConfVar [Dependency] k -> Sem r BuildInfo
evalConditionTree GenericPackageDescription
cabal (CondTree ConfVar [Dependency] k -> Sem r BuildInfo)
-> ((UnqualComponentName, CondTree ConfVar [Dependency] k)
    -> CondTree ConfVar [Dependency] k)
-> (UnqualComponentName, CondTree ConfVar [Dependency] k)
-> Sem r BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] k)
-> CondTree ConfVar [Dependency] k
forall a b. (a, b) -> b
snd) [(UnqualComponentName, CondTree ConfVar [Dependency] k)]
conds
  let deps :: [(UnqualComponentName, [(PackageName, VersionRange)])]
deps = [(UnqualComponentName, BuildInfo)]
info [(UnqualComponentName, BuildInfo)]
-> ((UnqualComponentName, BuildInfo)
    -> (UnqualComponentName, [(PackageName, VersionRange)]))
-> [(UnqualComponentName, [(PackageName, VersionRange)])]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (BuildInfo -> Identity [(PackageName, VersionRange)])
-> (UnqualComponentName, BuildInfo)
-> Identity (UnqualComponentName, [(PackageName, VersionRange)])
forall s t a b. Field2 s t a b => Lens s t a b
_2 ((BuildInfo -> Identity [(PackageName, VersionRange)])
 -> (UnqualComponentName, BuildInfo)
 -> Identity (UnqualComponentName, [(PackageName, VersionRange)]))
-> (BuildInfo -> [(PackageName, VersionRange)])
-> (UnqualComponentName, BuildInfo)
-> (UnqualComponentName, [(PackageName, VersionRange)])
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ ((Dependency -> (PackageName, VersionRange))
-> [Dependency] -> [(PackageName, VersionRange)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Dependency -> (PackageName, VersionRange)
unDepV ([Dependency] -> [(PackageName, VersionRange)])
-> (BuildInfo -> [Dependency])
-> BuildInfo
-> [(PackageName, VersionRange)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuildInfo -> [Dependency]
buildDependsIfBuild)
      toolDeps :: [(UnqualComponentName, [(PackageName, VersionRange)])]
toolDeps = [(UnqualComponentName, BuildInfo)]
info [(UnqualComponentName, BuildInfo)]
-> ((UnqualComponentName, BuildInfo)
    -> (UnqualComponentName, [(PackageName, VersionRange)]))
-> [(UnqualComponentName, [(PackageName, VersionRange)])]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (BuildInfo -> Identity [(PackageName, VersionRange)])
-> (UnqualComponentName, BuildInfo)
-> Identity (UnqualComponentName, [(PackageName, VersionRange)])
forall s t a b. Field2 s t a b => Lens s t a b
_2 ((BuildInfo -> Identity [(PackageName, VersionRange)])
 -> (UnqualComponentName, BuildInfo)
 -> Identity (UnqualComponentName, [(PackageName, VersionRange)]))
-> (BuildInfo -> [(PackageName, VersionRange)])
-> (UnqualComponentName, BuildInfo)
-> (UnqualComponentName, [(PackageName, VersionRange)])
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (([LegacyExeDependency], [ExeDependency])
-> [(PackageName, VersionRange)]
unBuildTools (([LegacyExeDependency], [ExeDependency])
 -> [(PackageName, VersionRange)])
-> (BuildInfo -> ([LegacyExeDependency], [ExeDependency]))
-> BuildInfo
-> [(PackageName, VersionRange)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuildInfo -> ([LegacyExeDependency], [ExeDependency])
buildToolsAndbuildToolDependsIfBuild)
      sysDeps :: [(UnqualComponentName, [SystemDependency])]
sysDeps = [(UnqualComponentName, BuildInfo)]
info [(UnqualComponentName, BuildInfo)]
-> ((UnqualComponentName, BuildInfo)
    -> (UnqualComponentName, [SystemDependency]))
-> [(UnqualComponentName, [SystemDependency])]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (BuildInfo -> Identity [SystemDependency])
-> (UnqualComponentName, BuildInfo)
-> Identity (UnqualComponentName, [SystemDependency])
forall s t a b. Field2 s t a b => Lens s t a b
_2 ((BuildInfo -> Identity [SystemDependency])
 -> (UnqualComponentName, BuildInfo)
 -> Identity (UnqualComponentName, [SystemDependency]))
-> (BuildInfo -> [SystemDependency])
-> (UnqualComponentName, BuildInfo)
-> (UnqualComponentName, [SystemDependency])
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (([PkgconfigDependency], [String]) -> [SystemDependency]
unSystemDependency (([PkgconfigDependency], [String]) -> [SystemDependency])
-> (BuildInfo -> ([PkgconfigDependency], [String]))
-> BuildInfo
-> [SystemDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuildInfo -> ([PkgconfigDependency], [String])
pkgconfigDependsAndExtraLibsIfBuild)
  ((PackageName, VersionRange) -> Sem r ())
-> [(PackageName, VersionRange)] -> Sem r ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((PackageName -> VersionRange -> Sem r ())
-> (PackageName, VersionRange) -> Sem r ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> VersionRange -> Sem r ()
forall (r :: [Effect]).
Member DependencyRecord r =>
PackageName -> VersionRange -> Sem r ()
updateDependencyRecord) ([(PackageName, VersionRange)] -> Sem r ())
-> [(PackageName, VersionRange)] -> Sem r ()
forall a b. (a -> b) -> a -> b
$ [(UnqualComponentName, [(PackageName, VersionRange)])]
deps [(UnqualComponentName, [(PackageName, VersionRange)])]
-> Getting
     (Endo [[(PackageName, VersionRange)]])
     [(UnqualComponentName, [(PackageName, VersionRange)])]
     [(PackageName, VersionRange)]
-> [[(PackageName, VersionRange)]]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((UnqualComponentName, [(PackageName, VersionRange)])
 -> Const
      (Endo [[(PackageName, VersionRange)]])
      (UnqualComponentName, [(PackageName, VersionRange)]))
-> [(UnqualComponentName, [(PackageName, VersionRange)])]
-> Const
     (Endo [[(PackageName, VersionRange)]])
     [(UnqualComponentName, [(PackageName, VersionRange)])]
forall s t a b. Each s t a b => Traversal s t a b
each (((UnqualComponentName, [(PackageName, VersionRange)])
  -> Const
       (Endo [[(PackageName, VersionRange)]])
       (UnqualComponentName, [(PackageName, VersionRange)]))
 -> [(UnqualComponentName, [(PackageName, VersionRange)])]
 -> Const
      (Endo [[(PackageName, VersionRange)]])
      [(UnqualComponentName, [(PackageName, VersionRange)])])
-> (([(PackageName, VersionRange)]
     -> Const
          (Endo [[(PackageName, VersionRange)]])
          [(PackageName, VersionRange)])
    -> (UnqualComponentName, [(PackageName, VersionRange)])
    -> Const
         (Endo [[(PackageName, VersionRange)]])
         (UnqualComponentName, [(PackageName, VersionRange)]))
-> Getting
     (Endo [[(PackageName, VersionRange)]])
     [(UnqualComponentName, [(PackageName, VersionRange)])]
     [(PackageName, VersionRange)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(PackageName, VersionRange)]
 -> Const
      (Endo [[(PackageName, VersionRange)]])
      [(PackageName, VersionRange)])
-> (UnqualComponentName, [(PackageName, VersionRange)])
-> Const
     (Endo [[(PackageName, VersionRange)]])
     (UnqualComponentName, [(PackageName, VersionRange)])
forall s t a b. Field2 s t a b => Lens s t a b
_2 [[(PackageName, VersionRange)]]
-> Getting
     [(PackageName, VersionRange)]
     [[(PackageName, VersionRange)]]
     [(PackageName, VersionRange)]
-> [(PackageName, VersionRange)]
forall s a. s -> Getting a s a -> a
^. Getting
  [(PackageName, VersionRange)]
  [[(PackageName, VersionRange)]]
  [(PackageName, VersionRange)]
forall s t a b. Each s t a b => Traversal s t a b
each
  ((PackageName, VersionRange) -> Sem r ())
-> [(PackageName, VersionRange)] -> Sem r ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((PackageName -> VersionRange -> Sem r ())
-> (PackageName, VersionRange) -> Sem r ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> VersionRange -> Sem r ()
forall (r :: [Effect]).
Member DependencyRecord r =>
PackageName -> VersionRange -> Sem r ()
updateDependencyRecord) ([(PackageName, VersionRange)] -> Sem r ())
-> [(PackageName, VersionRange)] -> Sem r ()
forall a b. (a -> b) -> a -> b
$ [(UnqualComponentName, [(PackageName, VersionRange)])]
toolDeps [(UnqualComponentName, [(PackageName, VersionRange)])]
-> Getting
     (Endo [[(PackageName, VersionRange)]])
     [(UnqualComponentName, [(PackageName, VersionRange)])]
     [(PackageName, VersionRange)]
-> [[(PackageName, VersionRange)]]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((UnqualComponentName, [(PackageName, VersionRange)])
 -> Const
      (Endo [[(PackageName, VersionRange)]])
      (UnqualComponentName, [(PackageName, VersionRange)]))
-> [(UnqualComponentName, [(PackageName, VersionRange)])]
-> Const
     (Endo [[(PackageName, VersionRange)]])
     [(UnqualComponentName, [(PackageName, VersionRange)])]
forall s t a b. Each s t a b => Traversal s t a b
each (((UnqualComponentName, [(PackageName, VersionRange)])
  -> Const
       (Endo [[(PackageName, VersionRange)]])
       (UnqualComponentName, [(PackageName, VersionRange)]))
 -> [(UnqualComponentName, [(PackageName, VersionRange)])]
 -> Const
      (Endo [[(PackageName, VersionRange)]])
      [(UnqualComponentName, [(PackageName, VersionRange)])])
-> (([(PackageName, VersionRange)]
     -> Const
          (Endo [[(PackageName, VersionRange)]])
          [(PackageName, VersionRange)])
    -> (UnqualComponentName, [(PackageName, VersionRange)])
    -> Const
         (Endo [[(PackageName, VersionRange)]])
         (UnqualComponentName, [(PackageName, VersionRange)]))
-> Getting
     (Endo [[(PackageName, VersionRange)]])
     [(UnqualComponentName, [(PackageName, VersionRange)])]
     [(PackageName, VersionRange)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(PackageName, VersionRange)]
 -> Const
      (Endo [[(PackageName, VersionRange)]])
      [(PackageName, VersionRange)])
-> (UnqualComponentName, [(PackageName, VersionRange)])
-> Const
     (Endo [[(PackageName, VersionRange)]])
     (UnqualComponentName, [(PackageName, VersionRange)])
forall s t a b. Field2 s t a b => Lens s t a b
_2 [[(PackageName, VersionRange)]]
-> Getting
     [(PackageName, VersionRange)]
     [[(PackageName, VersionRange)]]
     [(PackageName, VersionRange)]
-> [(PackageName, VersionRange)]
forall s a. s -> Getting a s a -> a
^. Getting
  [(PackageName, VersionRange)]
  [[(PackageName, VersionRange)]]
  [(PackageName, VersionRange)]
forall s t a b. Each s t a b => Traversal s t a b
each
  let result :: (a, a, [SystemDependency])
result = ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a
k [(UnqualComponentName, [(PackageName, VersionRange)])]
deps, [(UnqualComponentName, [(PackageName, VersionRange)])] -> a
k [(UnqualComponentName, [(PackageName, VersionRange)])]
toolDeps, [[SystemDependency]] -> [SystemDependency]
forall a. Monoid a => [a] -> a
mconcat ([[SystemDependency]] -> [SystemDependency])
-> [[SystemDependency]] -> [SystemDependency]
forall a b. (a -> b) -> a -> b
$ ((UnqualComponentName, [SystemDependency]) -> [SystemDependency])
-> [(UnqualComponentName, [SystemDependency])]
-> [[SystemDependency]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (UnqualComponentName, [SystemDependency]) -> [SystemDependency]
forall a b. (a, b) -> b
snd [(UnqualComponentName, [SystemDependency])]
sysDeps)
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Found: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (a, a, [SystemDependency]) -> String
forall a. Show a => a -> String
show (a, a, [SystemDependency])
result
  Sem r ()
forall (r :: [Effect]).
(HasCallStack, MemberWithError Trace r) =>
Sem r ()
traceCallStack
  (a, a, [SystemDependency]) -> Sem r (a, a, [SystemDependency])
forall (m :: * -> *) a. Monad m => a -> m a
return (a, a, [SystemDependency])
result

collectExeDeps ::
  (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>
  ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->
  GenericPackageDescription ->
  [UnqualComponentName] ->
  Sem r (a, a, [SystemDependency])
collectExeDeps :: ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectExeDeps = String
-> (GenericPackageDescription
    -> [(UnqualComponentName,
         CondTree ConfVar [Dependency] Executable)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
forall k (r :: [Effect]) a.
(HasCallStack, Semigroup k, HasBuildInfo k,
 Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a) =>
String
-> (GenericPackageDescription
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectComponentialDeps String
"exe" GenericPackageDescription
-> [(UnqualComponentName,
     CondTree ConfVar [Dependency] Executable)]
condExecutables

collectTestDeps ::
  (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>
  ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->
  GenericPackageDescription ->
  [UnqualComponentName] ->
  Sem r (a, a, [SystemDependency])
collectTestDeps :: ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectTestDeps = String
-> (GenericPackageDescription
    -> [(UnqualComponentName,
         CondTree ConfVar [Dependency] TestSuite)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
forall k (r :: [Effect]) a.
(HasCallStack, Semigroup k, HasBuildInfo k,
 Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a) =>
String
-> (GenericPackageDescription
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectComponentialDeps String
"test" GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
condTestSuites

collectSubLibDeps ::
  (HasCallStack, Members [KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r, Show a) =>
  ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a) ->
  GenericPackageDescription ->
  [UnqualComponentName] ->
  Sem r (a, a, [SystemDependency])
collectSubLibDeps :: ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectSubLibDeps = String
-> (GenericPackageDescription
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
forall k (r :: [Effect]) a.
(HasCallStack, Semigroup k, HasBuildInfo k,
 Members
   '[KnownGHCVersion, FlagAssignmentsEnv, DependencyRecord, Trace] r,
 Show a) =>
String
-> (GenericPackageDescription
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] k)])
-> ([(UnqualComponentName, [(PackageName, VersionRange)])] -> a)
-> GenericPackageDescription
-> [UnqualComponentName]
-> Sem r (a, a, [SystemDependency])
collectComponentialDeps String
"sublib" GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
condSubLibraries

collectSetupDeps ::
  (Member Trace r, Show a, Monoid a) =>
  ([(PackageName, VersionRange)] -> a) ->
  GenericPackageDescription ->
  Sem r a
collectSetupDeps :: ([(PackageName, VersionRange)] -> a)
-> GenericPackageDescription -> Sem r a
collectSetupDeps [(PackageName, VersionRange)] -> a
k GenericPackageDescription
cabal = do
  let name :: PackageName
name = GenericPackageDescription -> PackageName
getPkgName' GenericPackageDescription
cabal
  String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Getting setup dependencies of " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> PackageName -> String
forall a. Show a => a -> String
show PackageName
name
  case PackageDescription -> Maybe SetupBuildInfo
setupBuildInfo (PackageDescription -> Maybe SetupBuildInfo)
-> PackageDescription -> Maybe SetupBuildInfo
forall a b. (a -> b) -> a -> b
$ GenericPackageDescription -> PackageDescription
packageDescription GenericPackageDescription
cabal of
    Just (SetupBuildInfo [Dependency]
deps Bool
_) -> do
      let result :: a
result = [(PackageName, VersionRange)] -> a
k ([(PackageName, VersionRange)] -> a)
-> [(PackageName, VersionRange)] -> a
forall a b. (a -> b) -> a -> b
$ Dependency -> (PackageName, VersionRange)
unDepV (Dependency -> (PackageName, VersionRange))
-> [Dependency] -> [(PackageName, VersionRange)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Dependency]
deps
      String -> Sem r ()
forall (r :: [Effect]).
MemberWithError Trace r =>
String -> Sem r ()
trace' (String -> Sem r ()) -> String -> Sem r ()
forall a b. (a -> b) -> a -> b
$ String
"Found: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> a -> String
forall a. Show a => a -> String
show a
result
      a -> Sem r a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result
    Maybe SetupBuildInfo
_ -> a -> Sem r a
forall (m :: * -> *) a. Monad m => a -> m a
return a
forall a. Monoid a => a
mempty

updateDependencyRecord :: Member DependencyRecord r => PackageName -> VersionRange -> Sem r ()
updateDependencyRecord :: PackageName -> VersionRange -> Sem r ()
updateDependencyRecord PackageName
name VersionRange
range = (Map PackageName [VersionRange] -> Map PackageName [VersionRange])
-> Sem r ()
forall s (r :: [Effect]).
Member (State s) r =>
(s -> s) -> Sem r ()
modify' ((Map PackageName [VersionRange] -> Map PackageName [VersionRange])
 -> Sem r ())
-> (Map PackageName [VersionRange]
    -> Map PackageName [VersionRange])
-> Sem r ()
forall a b. (a -> b) -> a -> b
$ ([VersionRange] -> [VersionRange] -> [VersionRange])
-> PackageName
-> [VersionRange]
-> Map PackageName [VersionRange]
-> Map PackageName [VersionRange]
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith [VersionRange] -> [VersionRange] -> [VersionRange]
forall a. Semigroup a => a -> a -> a
(<>) PackageName
name [VersionRange
range]

-- collectBenchMarkDeps :: Members [HackageEnv, FlagAssignmentEnv] r => GenericPackageDescription -> [UnqualComponentName] -> Sem r (ComponentPkgList, ComponentPkgList)
-- collectBenchMarkDeps = collectComponentialDeps condBenchmarks

-----------------------------------------------------------------------------

-- | Generate 'PkgBuild' for a 'SolvedPackage'.
cabalToPkgBuild :: Members [HackageEnv, FlagAssignmentsEnv, WithMyErr] r => SolvedPackage -> Bool -> [ArchLinuxName] -> Sem r PkgBuild
cabalToPkgBuild :: SolvedPackage -> Bool -> [ArchLinuxName] -> Sem r PkgBuild
cabalToPkgBuild SolvedPackage
pkg Bool
uusi [ArchLinuxName]
sysDeps = do
  let name :: PackageName
name = SolvedPackage
pkg SolvedPackage
-> Getting PackageName SolvedPackage PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName SolvedPackage PackageName
Lens' SolvedPackage PackageName
pkgName
  PackageDescription
cabal <- GenericPackageDescription -> PackageDescription
packageDescription (GenericPackageDescription -> PackageDescription)
-> Sem r GenericPackageDescription -> Sem r PackageDescription
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageName -> Sem r GenericPackageDescription
forall (r :: [Effect]).
Members '[HackageEnv, WithMyErr] r =>
PackageName -> Sem r GenericPackageDescription
getLatestCabal PackageName
name
  String
_sha256sums <- (\case Just String
s -> String
"'" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"'"; Maybe String
Nothing -> String
"'SKIP'") (Maybe String -> String) -> Sem r (Maybe String) -> Sem r String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageName -> Sem r (Maybe String)
forall (r :: [Effect]).
Members '[HackageEnv, WithMyErr] r =>
PackageName -> Sem r (Maybe String)
getLatestSHA256 PackageName
name
  let _hkgName :: String
_hkgName = SolvedPackage
pkg SolvedPackage
-> Getting PackageName SolvedPackage PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName SolvedPackage PackageName
Lens' SolvedPackage PackageName
pkgName PackageName -> (PackageName -> String) -> String
forall a b. a -> (a -> b) -> b
& PackageName -> String
unPackageName
      _pkgName :: String
_pkgName = ArchLinuxName -> String
unArchLinuxName (ArchLinuxName -> String)
-> (PackageName -> ArchLinuxName) -> PackageName -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> ArchLinuxName
forall n. HasMyName n => n -> ArchLinuxName
toArchLinuxName (PackageName -> String) -> PackageName -> String
forall a b. (a -> b) -> a -> b
$ SolvedPackage
pkg SolvedPackage
-> Getting PackageName SolvedPackage PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName SolvedPackage PackageName
Lens' SolvedPackage PackageName
pkgName
      _pkgVer :: String
_pkgVer = Version -> String
forall a. Pretty a => a -> String
prettyShow (Version -> String) -> Version -> String
forall a b. (a -> b) -> a -> b
$ PackageDescription -> Version
getPkgVersion PackageDescription
cabal
      _pkgDesc :: String
_pkgDesc = ShortText -> String
fromShortText (ShortText -> String) -> ShortText -> String
forall a b. (a -> b) -> a -> b
$ PackageDescription -> ShortText
synopsis PackageDescription
cabal
      getL :: License -> String
getL License
NONE = String
""
      getL (License LicenseExpression
e) = LicenseExpression -> String
getE LicenseExpression
e
      getE :: LicenseExpression -> String
getE (ELicense (ELicenseId LicenseId
x) Maybe LicenseExceptionId
_) = License -> String
showArchLicense (License -> String)
-> (LicenseId -> License) -> LicenseId -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LicenseId -> License
mapLicense (LicenseId -> String) -> LicenseId -> String
forall a b. (a -> b) -> a -> b
$ LicenseId
x
      getE (ELicense (ELicenseIdPlus LicenseId
x) Maybe LicenseExceptionId
_) = License -> String
showArchLicense (License -> String)
-> (LicenseId -> License) -> LicenseId -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LicenseId -> License
mapLicense (LicenseId -> String) -> LicenseId -> String
forall a b. (a -> b) -> a -> b
$ LicenseId
x
      getE (ELicense (ELicenseRef LicenseRef
x) Maybe LicenseExceptionId
_) = String
"custom:" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> LicenseRef -> String
licenseRef LicenseRef
x
      getE (EAnd LicenseExpression
x LicenseExpression
y) = LicenseExpression -> String
getE LicenseExpression
x String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> LicenseExpression -> String
getE LicenseExpression
y
      getE (EOr LicenseExpression
x LicenseExpression
y) = LicenseExpression -> String
getE LicenseExpression
x String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> LicenseExpression -> String
getE LicenseExpression
y

      _license :: String
_license = License -> String
getL (License -> String)
-> (PackageDescription -> License) -> PackageDescription -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> License
license (PackageDescription -> String) -> PackageDescription -> String
forall a b. (a -> b) -> a -> b
$ PackageDescription
cabal
      _enableCheck :: Bool
_enableCheck = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (SolvedPackage
pkg SolvedPackage
-> Getting [SolvedDependency] SolvedPackage [SolvedDependency]
-> [SolvedDependency]
forall s a. s -> Getting a s a -> a
^. Getting [SolvedDependency] SolvedPackage [SolvedDependency]
Traversal' SolvedPackage [SolvedDependency]
pkgDeps) [SolvedDependency] -> (SolvedDependency -> Bool) -> [Bool]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
Test
      depends :: [SolvedDependency]
depends =
        SolvedPackage
pkg SolvedPackage
-> Getting [SolvedDependency] SolvedPackage [SolvedDependency]
-> [SolvedDependency]
forall s a. s -> Getting a s a -> a
^. Getting [SolvedDependency] SolvedPackage [SolvedDependency]
Traversal' SolvedPackage [SolvedDependency]
pkgDeps
          [SolvedDependency]
-> Getting
     (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
-> [SolvedDependency]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. Getting
  (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
forall s t a b. Each s t a b => Traversal s t a b
each
            Getting
  (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
-> ((SolvedDependency
     -> Const (Endo [SolvedDependency]) SolvedDependency)
    -> SolvedDependency
    -> Const (Endo [SolvedDependency]) SolvedDependency)
-> Getting
     (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SolvedDependency -> Bool)
-> Traversal' SolvedDependency SolvedDependency
forall a. (a -> Bool) -> Traversal' a a
filtered
              ( \SolvedDependency
x ->
                  PackageName -> SolvedDependency -> Bool
depNotMyself PackageName
name SolvedDependency
x
                    Bool -> Bool -> Bool
&& SolvedDependency -> Bool
depNotInGHCLib SolvedDependency
x
                    Bool -> Bool -> Bool
&& ( DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
Lib SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
Exe SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
SubLibs SolvedDependency
x
                       )
              )
      makeDepends :: [SolvedDependency]
makeDepends =
        SolvedPackage
pkg SolvedPackage
-> Getting [SolvedDependency] SolvedPackage [SolvedDependency]
-> [SolvedDependency]
forall s a. s -> Getting a s a -> a
^. Getting [SolvedDependency] SolvedPackage [SolvedDependency]
Traversal' SolvedPackage [SolvedDependency]
pkgDeps
          [SolvedDependency]
-> Getting
     (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
-> [SolvedDependency]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. Getting
  (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
forall s t a b. Each s t a b => Traversal s t a b
each
            Getting
  (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
-> ((SolvedDependency
     -> Const (Endo [SolvedDependency]) SolvedDependency)
    -> SolvedDependency
    -> Const (Endo [SolvedDependency]) SolvedDependency)
-> Getting
     (Endo [SolvedDependency]) [SolvedDependency] SolvedDependency
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SolvedDependency -> Bool)
-> Traversal' SolvedDependency SolvedDependency
forall a. (a -> Bool) -> Traversal' a a
filtered
              ( \SolvedDependency
x ->
                  SolvedDependency
x SolvedDependency -> [SolvedDependency] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [SolvedDependency]
depends
                    Bool -> Bool -> Bool
&& PackageName -> SolvedDependency -> Bool
depNotMyself PackageName
name SolvedDependency
x
                    Bool -> Bool -> Bool
&& SolvedDependency -> Bool
depNotInGHCLib SolvedDependency
x
                    Bool -> Bool -> Bool
&& ( DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
LibBuildTools SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
ExeBuildTools SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
Test SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
TestBuildTools SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
SubLibsBuildTools SolvedDependency
x
                           Bool -> Bool -> Bool
|| DependencyKind -> SolvedDependency -> Bool
depIsKind DependencyKind
Setup SolvedDependency
x
                       )
              )
      depsToString :: (a -> n) -> [a] -> String
depsToString a -> n
k [a]
deps = [a]
deps [a] -> (a -> String) -> [String]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (String -> String
wrap (String -> String) -> (a -> String) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArchLinuxName -> String
unArchLinuxName (ArchLinuxName -> String) -> (a -> ArchLinuxName) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. n -> ArchLinuxName
forall n. HasMyName n => n -> ArchLinuxName
toArchLinuxName (n -> ArchLinuxName) -> (a -> n) -> a -> ArchLinuxName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> n
k) [String] -> ([String] -> String) -> String
forall a b. a -> (a -> b) -> b
& [String] -> String
forall a. Monoid a => [a] -> a
mconcat
      _depends :: String
_depends = (SolvedDependency -> PackageName) -> [SolvedDependency] -> String
forall n a. HasMyName n => (a -> n) -> [a] -> String
depsToString SolvedDependency -> PackageName
_depName [SolvedDependency]
depends String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (ArchLinuxName -> ArchLinuxName) -> [ArchLinuxName] -> String
forall n a. HasMyName n => (a -> n) -> [a] -> String
depsToString ArchLinuxName -> ArchLinuxName
forall a. a -> a
id [ArchLinuxName]
sysDeps
      _makeDepends :: String
_makeDepends = (if Bool
uusi then String
" 'uusi'" else String
"") String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (SolvedDependency -> PackageName) -> [SolvedDependency] -> String
forall n a. HasMyName n => (a -> n) -> [a] -> String
depsToString SolvedDependency -> PackageName
_depName [SolvedDependency]
makeDepends
      _url :: String
_url = PackageDescription -> String
getUrl PackageDescription
cabal
      wrap :: String -> String
wrap String
s = String
" '" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"'"
      _licenseFile :: Maybe String
_licenseFile = PackageDescription -> [String]
licenseFiles PackageDescription
cabal [String] -> Getting (First String) [String] String -> Maybe String
forall s a. s -> Getting (First a) s a -> Maybe a
^? Index [String] -> Traversal' [String] (IxValue [String])
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index [String]
0
      _enableUusi :: Bool
_enableUusi = Bool
uusi
  PkgBuild -> Sem r PkgBuild
forall (m :: * -> *) a. Monad m => a -> m a
return PkgBuild :: String
-> String
-> String
-> String
-> String
-> String
-> String
-> String
-> String
-> Maybe String
-> Bool
-> Bool
-> PkgBuild
PkgBuild {Bool
String
Maybe String
_enableCheck :: Bool
_enableUusi :: Bool
_licenseFile :: Maybe String
_sha256sums :: String
_makeDepends :: String
_depends :: String
_license :: String
_url :: String
_pkgDesc :: String
_pkgVer :: String
_pkgName :: String
_hkgName :: String
_enableUusi :: Bool
_licenseFile :: Maybe String
_url :: String
_makeDepends :: String
_depends :: String
_enableCheck :: Bool
_license :: String
_pkgDesc :: String
_pkgVer :: String
_pkgName :: String
_hkgName :: String
_sha256sums :: String
..}

-----------------------------------------------------------------------------

-- | Get the ghc version in 'CommunityDB'
subsumeGHCVersion :: Members [CommunityEnv, WithMyErr] r => InterpreterFor KnownGHCVersion r
subsumeGHCVersion :: InterpreterFor KnownGHCVersion r
subsumeGHCVersion Sem (KnownGHCVersion : r) a
m = do
  String
rawVersion <- ArchLinuxName -> Sem r String
forall n (r :: [Effect]).
(HasMyName n, Members '[CommunityEnv, WithMyErr] r) =>
n -> Sem r String
versionInCommunity (ArchLinuxName -> Sem r String) -> ArchLinuxName -> Sem r String
forall a b. (a -> b) -> a -> b
$ String -> ArchLinuxName
ArchLinuxName String
"haskell-ghc"
  let ghcVersion :: Version
ghcVersion = Version -> Maybe Version -> Version
forall a. a -> Maybe a -> a
fromMaybe (String -> Version
forall a. HasCallStack => String -> a
error (String -> Version) -> String -> Version
forall a b. (a -> b) -> a -> b
$ String
"Impossible: unable to parse ghc version from [community]: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
rawVersion) (Maybe Version -> Version) -> Maybe Version -> Version
forall a b. (a -> b) -> a -> b
$ String -> Maybe Version
forall a. Parsec a => String -> Maybe a
simpleParsec String
rawVersion
  Version -> Sem (KnownGHCVersion : r) a -> Sem r a
forall i (r :: [Effect]) a. i -> Sem (Reader i : r) a -> Sem r a
runReader Version
ghcVersion Sem (KnownGHCVersion : r) a
m