{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Copyright: (c) 2020 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <1793913507@qq.com>
-- Stability: experimental
-- Portability: portable
-- This module provides core functionality of @uusi@.
-- It exports the core function 'uusiGenericPackageDescription', and some functions to create 'Uusi'.
module Distribution.Uusi.Core
  ( uusiGenericPackageDescription,
    allToAnyVersion,
    removeByName,
    overwriteByName,
    replaceByName,
    buildableByName,
  )
where

import Data.List ((\\))
import Data.Maybe (catMaybes)
import qualified Data.Text as T
import Distribution.Types.CondTree (CondTree, mapTreeConstrs, mapTreeData)
import Distribution.Types.Dependency (Dependency)
import Distribution.Types.Lens
import Distribution.Types.PackageName (PackageName, unPackageName)
import Distribution.Types.UnqualComponentName
import Distribution.Types.VersionRange (VersionRange, anyVersion)
import Distribution.Uusi.Types
import Distribution.Uusi.Utils
import Lens.Micro

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

-- | Create 'Action' that removes all version constraints
allToAnyVersion :: Uusi
allToAnyVersion :: Uusi
allToAnyVersion = Text -> (PackageName -> Bool) -> VersionRange -> Uusi
forall tag.
tag -> (PackageName -> Bool) -> VersionRange -> Action tag
SetVersion Text
"All dependencies" (Bool -> PackageName -> Bool
forall a b. a -> b -> a
const Bool
True) VersionRange
anyVersion

-- | Create 'Action' that removes a dependency by given its name
removeByName :: PackageName -> Uusi
removeByName :: PackageName -> Uusi
removeByName PackageName
name = Text -> (PackageName -> Bool) -> Uusi
forall tag. tag -> (PackageName -> Bool) -> Action tag
Remove (PackageName -> String
unPackageName PackageName
name String -> (String -> Text) -> Text
forall a b. a -> (a -> b) -> b
|> String -> Text
T.pack) (PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName
name)

-- | Create 'Action' that overwrites a dependency's version range
overwriteByName :: PackageName -> VersionRange -> Uusi
overwriteByName :: PackageName -> VersionRange -> Uusi
overwriteByName PackageName
name = Text -> (PackageName -> Bool) -> VersionRange -> Uusi
forall tag.
tag -> (PackageName -> Bool) -> VersionRange -> Action tag
SetVersion (PackageName -> String
unPackageName PackageName
name String -> (String -> Text) -> Text
forall a b. a -> (a -> b) -> b
|> String -> Text
T.pack) (PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName
name)

-- | Create 'Action' that replace a dependency with a set of packages
replaceByName :: PackageName -> [(PackageName, VersionRange)] -> Uusi
replaceByName :: PackageName -> [(PackageName, VersionRange)] -> Uusi
replaceByName PackageName
name [(PackageName, VersionRange)]
t = Text -> (PackageName -> Bool) -> [VersionedPackage] -> Uusi
forall tag.
tag -> (PackageName -> Bool) -> [VersionedPackage] -> Action tag
Replace (PackageName -> String
unPackageName PackageName
name String -> (String -> Text) -> Text
forall a b. a -> (a -> b) -> b
|> String -> Text
T.pack) (PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName
name) ((PackageName -> VersionRange -> VersionedPackage)
-> (PackageName, VersionRange) -> VersionedPackage
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> VersionRange -> VersionedPackage
VersionedPackage ((PackageName, VersionRange) -> VersionedPackage)
-> [(PackageName, VersionRange)] -> [VersionedPackage]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(PackageName, VersionRange)]
t)

-- | Create 'Action' that set the buildable of a component
buildableByName :: UnqualComponentName -> Bool -> Uusi
buildableByName :: UnqualComponentName -> Bool -> Uusi
buildableByName UnqualComponentName
name = Text -> (UnqualComponentName -> Bool) -> Bool -> Uusi
forall tag.
tag -> (UnqualComponentName -> Bool) -> Bool -> Action tag
SetBuildable (UnqualComponentName -> String
unUnqualComponentName UnqualComponentName
name String -> (String -> Text) -> Text
forall a b. a -> (a -> b) -> b
|> String -> Text
T.pack) (UnqualComponentName -> UnqualComponentName -> Bool
forall a. Eq a => a -> a -> Bool
== UnqualComponentName
name)

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

uusiRange' :: HasVersionedPackage a => Uusi -> Op a
uusiRange' :: Uusi -> Op a
uusiRange' (SetVersion Text
_ PackageName -> Bool
p VersionRange
range) a
x
  | PackageName -> Bool
p (PackageName -> Bool) -> PackageName -> Bool
forall a b. (a -> b) -> a -> b
$ a
x a -> Getting PackageName a PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName a PackageName
forall c. HasVersionedPackage c => Lens' c PackageName
myPkgName = a
x a -> Op a -> a
forall a b. a -> (a -> b) -> b
& (VersionRange -> Identity VersionRange) -> a -> Identity a
forall c. HasVersionedPackage c => Lens' c VersionRange
myVersionRange ((VersionRange -> Identity VersionRange) -> a -> Identity a)
-> VersionRange -> Op a
forall s t a b. ASetter s t a b -> b -> s -> t
.~ VersionRange
range
  | Bool
otherwise = a
x
uusiRange' Uusi
_ a
x = a
x

uusiRange :: HasVersionedPackage a => SomeUusi -> Op a
uusiRange :: SomeUusi -> Op a
uusiRange SomeUusi
actions = [Op a] -> Op a
forall a. [Op a] -> Op a
chain ([Op a] -> Op a) -> [Op a] -> Op a
forall a b. (a -> b) -> a -> b
<| Uusi -> Op a
forall a. HasVersionedPackage a => Uusi -> Op a
uusiRange' (Uusi -> Op a) -> SomeUusi -> [Op a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SomeUusi
actions

uusiReplace' :: HasVersionedPackage a => Uusi -> a -> [a]
uusiReplace' :: Uusi -> a -> [a]
uusiReplace' (Replace Text
_ PackageName -> Bool
p [VersionedPackage]
targets) a
x
  | PackageName -> Bool
p (PackageName -> Bool) -> PackageName -> Bool
forall a b. (a -> b) -> a -> b
$ a
x a -> Getting PackageName a PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName a PackageName
forall c. HasVersionedPackage c => Lens' c PackageName
myPkgName =
    ( \VersionedPackage
t ->
        a
x
          a -> (a -> a) -> a
forall a b. a -> (a -> b) -> b
& (PackageName -> Identity PackageName) -> a -> Identity a
forall c. HasVersionedPackage c => Lens' c PackageName
myPkgName ((PackageName -> Identity PackageName) -> a -> Identity a)
-> PackageName -> a -> a
forall s t a b. ASetter s t a b -> b -> s -> t
.~ VersionedPackage
t VersionedPackage
-> Getting PackageName VersionedPackage PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName VersionedPackage PackageName
forall c. HasVersionedPackage c => Lens' c PackageName
myPkgName
          a -> (a -> a) -> a
forall a b. a -> (a -> b) -> b
& (VersionRange -> Identity VersionRange) -> a -> Identity a
forall c. HasVersionedPackage c => Lens' c VersionRange
myVersionRange ((VersionRange -> Identity VersionRange) -> a -> Identity a)
-> VersionRange -> a -> a
forall s t a b. ASetter s t a b -> b -> s -> t
.~ VersionedPackage
t VersionedPackage
-> Getting VersionRange VersionedPackage VersionRange
-> VersionRange
forall s a. s -> Getting a s a -> a
^. Getting VersionRange VersionedPackage VersionRange
forall c. HasVersionedPackage c => Lens' c VersionRange
myVersionRange
    )
      (VersionedPackage -> a) -> [VersionedPackage] -> [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VersionedPackage]
targets
  | Bool
otherwise = []
uusiReplace' Uusi
_ a
_ = []

uusiReplace :: (HasVersionedPackage a, Eq a) => SomeUusi -> Op [a]
uusiReplace :: SomeUusi -> Op [a]
uusiReplace SomeUusi
actions [a]
t =
  let k :: [(a, Maybe a)]
k = [(a
r', if Bool
success then a -> Maybe a
forall a. a -> Maybe a
Just a
x else Maybe a
forall a. Maybe a
Nothing) | a
x <- [a]
t, Uusi
a <- SomeUusi
actions, let r :: [a]
r = Uusi -> a -> [a]
forall a. HasVersionedPackage a => Uusi -> a -> [a]
uusiReplace' Uusi
a a
x, let success :: Bool
success = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
r, a
r' <- [a]
r]
      kf :: [a]
kf = (a, Maybe a) -> a
forall a b. (a, b) -> a
fst ((a, Maybe a) -> a) -> [(a, Maybe a)] -> [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(a, Maybe a)]
k
      ks :: [a]
ks = [Maybe a] -> [a]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe a] -> [a]) -> [Maybe a] -> [a]
forall a b. (a -> b) -> a -> b
$ (a, Maybe a) -> Maybe a
forall a b. (a, b) -> b
snd ((a, Maybe a) -> Maybe a) -> [(a, Maybe a)] -> [Maybe a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(a, Maybe a)]
k
   in -- TODO: this is ugly
      [a]
kf [a] -> Op [a]
forall a. Semigroup a => a -> a -> a
<> ([a]
t [a] -> Op [a]
forall a. Eq a => [a] -> [a] -> [a]
\\ [a]
ks)

uusiRemove :: HasVersionedPackage a => SomeUusi -> Op [a]
uusiRemove :: SomeUusi -> Op [a]
uusiRemove SomeUusi
actions [a]
t = let ps :: [PackageName -> Bool]
ps = [PackageName -> Bool
p | (Remove Text
_ PackageName -> Bool
p) <- SomeUusi
actions] in (a -> Bool) -> Op [a]
forall a. (a -> Bool) -> [a] -> [a]
filter (\a
x -> [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
<| ((PackageName -> Bool) -> Bool) -> [PackageName -> Bool] -> [Bool]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Bool
not (Bool -> Bool)
-> ((PackageName -> Bool) -> Bool) -> (PackageName -> Bool) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((PackageName -> Bool) -> PackageName -> Bool
forall a b. (a -> b) -> a -> b
<| (a
x a -> Getting PackageName a PackageName -> PackageName
forall s a. s -> Getting a s a -> a
^. Getting PackageName a PackageName
forall c. HasVersionedPackage c => Lens' c PackageName
myPkgName))) [PackageName -> Bool]
ps) [a]
t

uusiBuildable :: HasBuildInfo a => SomeUusi -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiBuildable :: SomeUusi
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiBuildable SomeUusi
actions (UnqualComponentName, CondTree ConfVar [Dependency] a)
t
  | (UnqualComponentName
name, CondTree ConfVar [Dependency] a
tree) <- (UnqualComponentName, CondTree ConfVar [Dependency] a)
t,
    (Bool
b : [Bool]
_) <- [Bool
b | (SetBuildable Text
_ UnqualComponentName -> Bool
p Bool
b) <- SomeUusi
actions, UnqualComponentName -> Bool
p UnqualComponentName
name] =
    (UnqualComponentName
name, (a -> a)
-> CondTree ConfVar [Dependency] a
-> CondTree ConfVar [Dependency] a
forall a b v c. (a -> b) -> CondTree v c a -> CondTree v c b
mapTreeData (LensLike Identity a a BuildInfo BuildInfo
forall a. HasBuildInfo a => Lens' a BuildInfo
buildInfo LensLike Identity a a BuildInfo BuildInfo
-> (BuildInfo -> BuildInfo) -> a -> a
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ LensLike Identity BuildInfo BuildInfo Bool Bool
forall a. HasBuildInfo a => Lens' a Bool
buildable LensLike Identity BuildInfo BuildInfo Bool Bool
-> Bool -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
b) CondTree ConfVar [Dependency] a
tree)
  | Bool
otherwise = (UnqualComponentName, CondTree ConfVar [Dependency] a)
t

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

uusiBuildInfo :: SomeUusi -> Op BuildInfo
uusiBuildInfo :: SomeUusi -> BuildInfo -> BuildInfo
uusiBuildInfo SomeUusi
actions BuildInfo
i =
  BuildInfo
i
    BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
|> (LensLike Identity BuildInfo BuildInfo [Dependency] [Dependency]
forall a. HasBuildInfo a => Lens' a [Dependency]
targetBuildDepends LensLike Identity BuildInfo BuildInfo [Dependency] [Dependency]
-> ([Dependency] -> [Dependency]) -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (Dependency -> Dependency) -> [Dependency] -> [Dependency]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (SomeUusi -> Dependency -> Dependency
forall a. HasVersionedPackage a => SomeUusi -> Op a
uusiRange SomeUusi
actions) ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [Dependency] -> [Dependency]
forall a. (HasVersionedPackage a, Eq a) => SomeUusi -> Op [a]
uusiReplace SomeUusi
actions ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [Dependency] -> [Dependency]
forall a. HasVersionedPackage a => SomeUusi -> Op [a]
uusiRemove SomeUusi
actions)
    BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity BuildInfo BuildInfo [ExeDependency] [ExeDependency]
forall a. HasBuildInfo a => Lens' a [ExeDependency]
buildToolDepends LensLike
  Identity BuildInfo BuildInfo [ExeDependency] [ExeDependency]
-> ([ExeDependency] -> [ExeDependency]) -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (ExeDependency -> ExeDependency)
-> [ExeDependency] -> [ExeDependency]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (SomeUusi -> ExeDependency -> ExeDependency
forall a. HasVersionedPackage a => SomeUusi -> Op a
uusiRange SomeUusi
actions) ([ExeDependency] -> [ExeDependency])
-> ([ExeDependency] -> [ExeDependency])
-> [ExeDependency]
-> [ExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [ExeDependency] -> [ExeDependency]
forall a. (HasVersionedPackage a, Eq a) => SomeUusi -> Op [a]
uusiReplace SomeUusi
actions ([ExeDependency] -> [ExeDependency])
-> ([ExeDependency] -> [ExeDependency])
-> [ExeDependency]
-> [ExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [ExeDependency] -> [ExeDependency]
forall a. HasVersionedPackage a => SomeUusi -> Op [a]
uusiRemove SomeUusi
actions)
    BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity
  BuildInfo
  BuildInfo
  [LegacyExeDependency]
  [LegacyExeDependency]
forall a. HasBuildInfo a => Lens' a [LegacyExeDependency]
buildTools LensLike
  Identity
  BuildInfo
  BuildInfo
  [LegacyExeDependency]
  [LegacyExeDependency]
-> ([LegacyExeDependency] -> [LegacyExeDependency])
-> BuildInfo
-> BuildInfo
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (LegacyExeDependency -> LegacyExeDependency)
-> [LegacyExeDependency] -> [LegacyExeDependency]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (SomeUusi -> LegacyExeDependency -> LegacyExeDependency
forall a. HasVersionedPackage a => SomeUusi -> Op a
uusiRange SomeUusi
actions) ([LegacyExeDependency] -> [LegacyExeDependency])
-> ([LegacyExeDependency] -> [LegacyExeDependency])
-> [LegacyExeDependency]
-> [LegacyExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [LegacyExeDependency] -> [LegacyExeDependency]
forall a. (HasVersionedPackage a, Eq a) => SomeUusi -> Op [a]
uusiReplace SomeUusi
actions ([LegacyExeDependency] -> [LegacyExeDependency])
-> ([LegacyExeDependency] -> [LegacyExeDependency])
-> [LegacyExeDependency]
-> [LegacyExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [LegacyExeDependency] -> [LegacyExeDependency]
forall a. HasVersionedPackage a => SomeUusi -> Op [a]
uusiRemove SomeUusi
actions)

uusiCondTree :: (HasBuildInfo a) => SomeUusi -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree :: SomeUusi -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree SomeUusi
actions = (a -> a) -> Op (CondTree ConfVar [Dependency] a)
forall a b v c. (a -> b) -> CondTree v c a -> CondTree v c b
mapTreeData (LensLike Identity a a BuildInfo BuildInfo
forall a. HasBuildInfo a => Lens' a BuildInfo
buildInfo LensLike Identity a a BuildInfo BuildInfo
-> (BuildInfo -> BuildInfo) -> a -> a
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ SomeUusi -> BuildInfo -> BuildInfo
uusiBuildInfo SomeUusi
actions) Op (CondTree ConfVar [Dependency] a)
-> Op (CondTree ConfVar [Dependency] a)
-> Op (CondTree ConfVar [Dependency] a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Dependency] -> [Dependency])
-> Op (CondTree ConfVar [Dependency] a)
forall c d v a. (c -> d) -> CondTree v c a -> CondTree v d a
mapTreeConstrs ((Dependency -> Dependency) -> [Dependency] -> [Dependency]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (SomeUusi -> Dependency -> Dependency
forall a. HasVersionedPackage a => SomeUusi -> Op a
uusiRange SomeUusi
actions) ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [Dependency] -> [Dependency]
forall a. (HasVersionedPackage a, Eq a) => SomeUusi -> Op [a]
uusiReplace SomeUusi
actions ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeUusi -> [Dependency] -> [Dependency]
forall a. HasVersionedPackage a => SomeUusi -> Op [a]
uusiRemove SomeUusi
actions)

-- | The core function of @uusi@.
uusiGenericPackageDescription ::
  -- | A list of 'Action' to apply
  SomeUusi ->
  Op GenericPackageDescription
uusiGenericPackageDescription :: SomeUusi -> Op GenericPackageDescription
uusiGenericPackageDescription SomeUusi
actions GenericPackageDescription
cabal =
  GenericPackageDescription
cabal
    GenericPackageDescription
-> Op GenericPackageDescription -> GenericPackageDescription
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
Lens'
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
condExecutables LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
-> ([(UnqualComponentName,
      CondTree ConfVar [Dependency] Executable)]
    -> [(UnqualComponentName,
         CondTree ConfVar [Dependency] Executable)])
-> Op GenericPackageDescription
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
-> [(UnqualComponentName,
     CondTree ConfVar [Dependency] Executable)]
forall (f :: * -> *) a.
(Functor f, HasBuildInfo a) =>
f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiTrees)
    GenericPackageDescription
-> Op GenericPackageDescription -> GenericPackageDescription
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
Lens'
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
condTestSuites LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> ([(UnqualComponentName,
      CondTree ConfVar [Dependency] TestSuite)]
    -> [(UnqualComponentName,
         CondTree ConfVar [Dependency] TestSuite)])
-> Op GenericPackageDescription
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
forall (f :: * -> *) a.
(Functor f, HasBuildInfo a) =>
f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiTrees)
    GenericPackageDescription
-> Op GenericPackageDescription -> GenericPackageDescription
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
Lens'
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
condBenchmarks LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> ([(UnqualComponentName,
      CondTree ConfVar [Dependency] Benchmark)]
    -> [(UnqualComponentName,
         CondTree ConfVar [Dependency] Benchmark)])
-> Op GenericPackageDescription
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
forall (f :: * -> *) a.
(Functor f, HasBuildInfo a) =>
f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiTrees)
    GenericPackageDescription
-> Op GenericPackageDescription -> GenericPackageDescription
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
Lens'
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
condSubLibraries LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
  [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> ([(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
    -> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)])
-> Op GenericPackageDescription
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
forall (f :: * -> *) a.
(Functor f, HasBuildInfo a) =>
f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiTrees)
    GenericPackageDescription
-> Op GenericPackageDescription -> GenericPackageDescription
forall a b. a -> (a -> b) -> b
|> (LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  (Maybe (CondTree ConfVar [Dependency] Library))
  (Maybe (CondTree ConfVar [Dependency] Library))
Lens'
  GenericPackageDescription
  (Maybe (CondTree ConfVar [Dependency] Library))
condLibrary LensLike
  Identity
  GenericPackageDescription
  GenericPackageDescription
  (Maybe (CondTree ConfVar [Dependency] Library))
  (Maybe (CondTree ConfVar [Dependency] Library))
-> ((CondTree ConfVar [Dependency] Library
     -> Identity (CondTree ConfVar [Dependency] Library))
    -> Maybe (CondTree ConfVar [Dependency] Library)
    -> Identity (Maybe (CondTree ConfVar [Dependency] Library)))
-> (CondTree ConfVar [Dependency] Library
    -> Identity (CondTree ConfVar [Dependency] Library))
-> GenericPackageDescription
-> Identity GenericPackageDescription
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CondTree ConfVar [Dependency] Library
 -> Identity (CondTree ConfVar [Dependency] Library))
-> Maybe (CondTree ConfVar [Dependency] Library)
-> Identity (Maybe (CondTree ConfVar [Dependency] Library))
forall (f :: * -> *) a b. Functor f => ASetter (f a) (f b) a b
mapped ((CondTree ConfVar [Dependency] Library
  -> Identity (CondTree ConfVar [Dependency] Library))
 -> GenericPackageDescription -> Identity GenericPackageDescription)
-> (CondTree ConfVar [Dependency] Library
    -> CondTree ConfVar [Dependency] Library)
-> Op GenericPackageDescription
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ SomeUusi
-> CondTree ConfVar [Dependency] Library
-> CondTree ConfVar [Dependency] Library
forall a.
HasBuildInfo a =>
SomeUusi -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree SomeUusi
actions)
  where
    uusiTrees :: f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiTrees f (UnqualComponentName, CondTree ConfVar [Dependency] a)
trees = f (UnqualComponentName, CondTree ConfVar [Dependency] a)
trees f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> ((UnqualComponentName, CondTree ConfVar [Dependency] a)
    -> (UnqualComponentName, CondTree ConfVar [Dependency] a))
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (CondTree ConfVar [Dependency] a
 -> Identity (CondTree ConfVar [Dependency] a))
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> Identity (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall s t a b. Field2 s t a b => Lens s t a b
_2 ((CondTree ConfVar [Dependency] a
  -> Identity (CondTree ConfVar [Dependency] a))
 -> (UnqualComponentName, CondTree ConfVar [Dependency] a)
 -> Identity (UnqualComponentName, CondTree ConfVar [Dependency] a))
-> (CondTree ConfVar [Dependency] a
    -> CondTree ConfVar [Dependency] a)
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ SomeUusi
-> CondTree ConfVar [Dependency] a
-> CondTree ConfVar [Dependency] a
forall a.
HasBuildInfo a =>
SomeUusi -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree SomeUusi
actions f (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> ((UnqualComponentName, CondTree ConfVar [Dependency] a)
    -> (UnqualComponentName, CondTree ConfVar [Dependency] a))
-> f (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> SomeUusi
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall a.
HasBuildInfo a =>
SomeUusi
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiBuildable SomeUusi
actions