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

-- | Copyright: (c) 2020-2021 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <berberman@yandex.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,
    optionsByName,
    addOptionsForAll,
    removeOptionsForAll,
  )
where

import Data.List ((\\))
import Data.Maybe (catMaybes)
import qualified Data.Text as T
import Distribution.Compiler (PerCompilerFlavor (..))
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 Distribution.Uusi.Lens

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

-- | 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 replaces 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 sets the buildable of a component (not library)
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)

-- | Create 'Action' that modifies ghc-options of a component (or the library, if @name == "library"@)
optionsByName :: UnqualComponentName -> Op [String] -> Uusi
optionsByName :: UnqualComponentName -> Op [String] -> Uusi
optionsByName UnqualComponentName
name = Text -> (UnqualComponentName -> Bool) -> Op [String] -> Uusi
forall tag.
tag -> (UnqualComponentName -> Bool) -> Op [String] -> Action tag
ModifyBuiltOptions (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)

-- | Create 'Action' that appends @opts@ to ghc-options of all components and the library
addOptionsForAll :: [String] -> Uusi
addOptionsForAll :: [String] -> Uusi
addOptionsForAll [String]
opts =
  Text -> (UnqualComponentName -> Bool) -> Op [String] -> Uusi
forall tag.
tag -> (UnqualComponentName -> Bool) -> Op [String] -> Action tag
ModifyBuiltOptions
    (Text
"Add " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack ([String] -> String
forall a. Show a => a -> String
show [String]
opts) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" to all components and the library")
    (Bool -> UnqualComponentName -> Bool
forall a b. a -> b -> a
const Bool
True)
    ([String] -> Op [String]
forall a. Semigroup a => a -> a -> a
<> [String]
opts)

-- | Create 'Action' that removes @opts@ from ghc-options of all components and the library
removeOptionsForAll :: [String] -> Uusi
removeOptionsForAll :: [String] -> Uusi
removeOptionsForAll [String]
opts =
  Text -> (UnqualComponentName -> Bool) -> Op [String] -> Uusi
forall tag.
tag -> (UnqualComponentName -> Bool) -> Op [String] -> Action tag
ModifyBuiltOptions
    (Text
"Remove " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack ([String] -> String
forall a. Show a => a -> String
show [String]
opts) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" from all components and the library")
    (Bool -> UnqualComponentName -> Bool
forall a b. a -> b -> a
const Bool
True)
    ((String -> Bool) -> Op [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [String]
opts))

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

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 a. HasVersionedPackage a => Lens' a PackageName
myPkgName = a
x a -> Op a -> a
forall a b. a -> (a -> b) -> b
& LensLike Identity a a VersionRange VersionRange
forall a. HasVersionedPackage a => Lens' a VersionRange
myVersionRange LensLike Identity a a VersionRange VersionRange
-> 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 => Uusis -> Op a
uusiRange :: Uusis -> Op a
uusiRange Uusis
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) -> Uusis -> [Op a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uusis
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 a. HasVersionedPackage a => Lens' a PackageName
myPkgName =
    ( \VersionedPackage
t ->
        a
x
          a -> (a -> a) -> a
forall a b. a -> (a -> b) -> b
& LensLike Identity a a PackageName PackageName
forall a. HasVersionedPackage a => Lens' a PackageName
myPkgName LensLike Identity a a PackageName PackageName
-> 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 a. HasVersionedPackage a => Lens' a PackageName
myPkgName
          a -> (a -> a) -> a
forall a b. a -> (a -> b) -> b
& LensLike Identity a a VersionRange VersionRange
forall a. HasVersionedPackage a => Lens' a VersionRange
myVersionRange LensLike Identity a a VersionRange VersionRange
-> 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 a. HasVersionedPackage a => Lens' a 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) => Uusis -> Op [a]
uusiReplace :: Uusis -> Op [a]
uusiReplace Uusis
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 <- Uusis
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 => Uusis -> Op [a]
uusiRemove :: Uusis -> Op [a]
uusiRemove Uusis
actions [a]
t = let ps :: [PackageName -> Bool]
ps = [PackageName -> Bool
p | (Remove Text
_ PackageName -> Bool
p) <- Uusis
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 a. HasVersionedPackage a => Lens' a PackageName
myPkgName))) [PackageName -> Bool]
ps) [a]
t

uusiBuildable :: HasBuildInfo a => Uusis -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiBuildable :: Uusis -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiBuildable Uusis
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) <- Uusis
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

uusiOptions' :: HasBuildInfo a => Action tag -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions' :: Action tag
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions' (ModifyBuiltOptions tag
_ UnqualComponentName -> Bool
p Op [String]
f) (UnqualComponentName, CondTree ConfVar [Dependency] a)
x
  | (UnqualComponentName
name, CondTree ConfVar [Dependency] a
tree) <- (UnqualComponentName, CondTree ConfVar [Dependency] a)
x,
    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
  (PerCompilerFlavor [String])
  (PerCompilerFlavor [String])
forall a. HasBuildInfo a => Lens' a (PerCompilerFlavor [String])
options LensLike
  Identity
  BuildInfo
  BuildInfo
  (PerCompilerFlavor [String])
  (PerCompilerFlavor [String])
-> (PerCompilerFlavor [String] -> PerCompilerFlavor [String])
-> BuildInfo
-> BuildInfo
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ \(PerCompilerFlavor [String]
ghc [String]
ghcjs) -> [String] -> [String] -> PerCompilerFlavor [String]
forall v. v -> v -> PerCompilerFlavor v
PerCompilerFlavor (Op [String]
f [String]
ghc) [String]
ghcjs) CondTree ConfVar [Dependency] a
tree)
uusiOptions' Action tag
_ (UnqualComponentName, CondTree ConfVar [Dependency] a)
x = (UnqualComponentName, CondTree ConfVar [Dependency] a)
x

uusiOptions :: HasBuildInfo a => [Action tag] -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions :: [Action tag]
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions [Action tag]
actions = [Op (UnqualComponentName, CondTree ConfVar [Dependency] a)]
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall a. [Op a] -> Op a
chain ([Op (UnqualComponentName, CondTree ConfVar [Dependency] a)]
 -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a))
-> [Op (UnqualComponentName, CondTree ConfVar [Dependency] a)]
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall a b. (a -> b) -> a -> b
<| Action tag
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall a tag.
HasBuildInfo a =>
Action tag
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions' (Action tag
 -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a))
-> [Action tag]
-> [Op (UnqualComponentName, CondTree ConfVar [Dependency] a)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Action tag]
actions

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

uusiBuildInfo :: Uusis -> Op BuildInfo
uusiBuildInfo :: Uusis -> BuildInfo -> BuildInfo
uusiBuildInfo Uusis
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 (Uusis -> Dependency -> Dependency
forall a. HasVersionedPackage a => Uusis -> Op a
uusiRange Uusis
actions) ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [Dependency] -> [Dependency]
forall a. (HasVersionedPackage a, Eq a) => Uusis -> Op [a]
uusiReplace Uusis
actions ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [Dependency] -> [Dependency]
forall a. HasVersionedPackage a => Uusis -> Op [a]
uusiRemove Uusis
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 (Uusis -> ExeDependency -> ExeDependency
forall a. HasVersionedPackage a => Uusis -> Op a
uusiRange Uusis
actions) ([ExeDependency] -> [ExeDependency])
-> ([ExeDependency] -> [ExeDependency])
-> [ExeDependency]
-> [ExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [ExeDependency] -> [ExeDependency]
forall a. (HasVersionedPackage a, Eq a) => Uusis -> Op [a]
uusiReplace Uusis
actions ([ExeDependency] -> [ExeDependency])
-> ([ExeDependency] -> [ExeDependency])
-> [ExeDependency]
-> [ExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [ExeDependency] -> [ExeDependency]
forall a. HasVersionedPackage a => Uusis -> Op [a]
uusiRemove Uusis
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 (Uusis -> LegacyExeDependency -> LegacyExeDependency
forall a. HasVersionedPackage a => Uusis -> Op a
uusiRange Uusis
actions) ([LegacyExeDependency] -> [LegacyExeDependency])
-> ([LegacyExeDependency] -> [LegacyExeDependency])
-> [LegacyExeDependency]
-> [LegacyExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [LegacyExeDependency] -> [LegacyExeDependency]
forall a. (HasVersionedPackage a, Eq a) => Uusis -> Op [a]
uusiReplace Uusis
actions ([LegacyExeDependency] -> [LegacyExeDependency])
-> ([LegacyExeDependency] -> [LegacyExeDependency])
-> [LegacyExeDependency]
-> [LegacyExeDependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [LegacyExeDependency] -> [LegacyExeDependency]
forall a. HasVersionedPackage a => Uusis -> Op [a]
uusiRemove Uusis
actions)

uusiCondTree :: (HasBuildInfo a) => Uusis -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree :: Uusis -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree Uusis
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
%~ Uusis -> BuildInfo -> BuildInfo
uusiBuildInfo Uusis
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 (Uusis -> Dependency -> Dependency
forall a. HasVersionedPackage a => Uusis -> Op a
uusiRange Uusis
actions) ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [Dependency] -> [Dependency]
forall a. (HasVersionedPackage a, Eq a) => Uusis -> Op [a]
uusiReplace Uusis
actions ([Dependency] -> [Dependency])
-> ([Dependency] -> [Dependency]) -> [Dependency] -> [Dependency]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis -> [Dependency] -> [Dependency]
forall a. HasVersionedPackage a => Uusis -> Op [a]
uusiRemove Uusis
actions)

-- | The core function of @uusi@.
uusiGenericPackageDescription ::
  -- | A list of 'Action' to apply
  Uusis ->
  Op GenericPackageDescription
uusiGenericPackageDescription :: Uusis -> Op GenericPackageDescription
uusiGenericPackageDescription Uusis
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
%~ Uusis
-> CondTree ConfVar [Dependency] Library
-> CondTree ConfVar [Dependency] Library
forall a.
HasBuildInfo a =>
Uusis -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree Uusis
actions (CondTree ConfVar [Dependency] Library
 -> CondTree ConfVar [Dependency] Library)
-> (CondTree ConfVar [Dependency] Library
    -> CondTree ConfVar [Dependency] Library)
-> CondTree ConfVar [Dependency] Library
-> CondTree ConfVar [Dependency] Library
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> CondTree ConfVar [Dependency] Library
forall a b. (a, b) -> b
snd ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
 -> CondTree ConfVar [Dependency] Library)
-> (CondTree ConfVar [Dependency] Library
    -> (UnqualComponentName, CondTree ConfVar [Dependency] Library))
-> CondTree ConfVar [Dependency] Library
-> CondTree ConfVar [Dependency] Library
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Uusis
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] Library)
forall a tag.
HasBuildInfo a =>
[Action tag]
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions Uusis
actions Op (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> (CondTree ConfVar [Dependency] Library
    -> (UnqualComponentName, CondTree ConfVar [Dependency] Library))
-> CondTree ConfVar [Dependency] Library
-> (UnqualComponentName, CondTree ConfVar [Dependency] Library)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName
"library",)))
  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
<&> LensLike
  Identity
  (UnqualComponentName, CondTree ConfVar [Dependency] a)
  (UnqualComponentName, CondTree ConfVar [Dependency] a)
  (CondTree ConfVar [Dependency] a)
  (CondTree ConfVar [Dependency] a)
forall c a b. Lens (c, a) (c, b) a b
_2 LensLike
  Identity
  (UnqualComponentName, CondTree ConfVar [Dependency] a)
  (UnqualComponentName, CondTree ConfVar [Dependency] a)
  (CondTree ConfVar [Dependency] a)
  (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
%~ Uusis
-> CondTree ConfVar [Dependency] a
-> CondTree ConfVar [Dependency] a
forall a.
HasBuildInfo a =>
Uusis -> Op (CondTree ConfVar [Dependency] a)
uusiCondTree Uusis
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
<&> Uusis
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall a.
HasBuildInfo a =>
Uusis -> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiBuildable Uusis
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
<&> Uusis
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
-> (UnqualComponentName, CondTree ConfVar [Dependency] a)
forall a tag.
HasBuildInfo a =>
[Action tag]
-> Op (UnqualComponentName, CondTree ConfVar [Dependency] a)
uusiOptions Uusis
actions