{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ViewPatterns #-}
module Distribution.ArchHs.PP
( prettySkip,
prettyFlagAssignments,
prettyFlags,
prettySolvedPkgs,
prettyDeps,
ppSysDependencies,
ppDiffColored,
align2col,
dui,
cuo,
ppCommunity,
ppAur,
ppDBKind,
annYellow,
annGreen,
annMagneta,
annRed,
annBold,
annCyan,
annBlue,
render,
viaPretty,
splitLine,
ppFromTo,
printInfo,
printWarn,
printError,
printSuccess,
module Prettyprinter,
module Prettyprinter.Render.Terminal,
)
where
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Algorithm.Diff
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import Distribution.ArchHs.FilesDB (DBKind)
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Types
import qualified Distribution.Pretty as DPretty
import Prettyprinter
import Prettyprinter.Render.Terminal
annYellow :: Doc AnsiStyle -> Doc AnsiStyle
annYellow :: Doc AnsiStyle -> Doc AnsiStyle
annYellow = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Yellow)
annCyan :: Doc AnsiStyle -> Doc AnsiStyle
annCyan :: Doc AnsiStyle -> Doc AnsiStyle
annCyan = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Cyan)
annMagneta :: Doc AnsiStyle -> Doc AnsiStyle
annMagneta :: Doc AnsiStyle -> Doc AnsiStyle
annMagneta = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Magenta)
annRed :: Doc AnsiStyle -> Doc AnsiStyle
annRed :: Doc AnsiStyle -> Doc AnsiStyle
annRed = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Red)
annGreen :: Doc AnsiStyle -> Doc AnsiStyle
annGreen :: Doc AnsiStyle -> Doc AnsiStyle
annGreen = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Green)
annBold :: Doc AnsiStyle -> Doc AnsiStyle
annBold :: Doc AnsiStyle -> Doc AnsiStyle
annBold = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate AnsiStyle
bold
annBlue :: Doc AnsiStyle -> Doc AnsiStyle
annBlue :: Doc AnsiStyle -> Doc AnsiStyle
annBlue = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Blue)
cuo :: Doc AnsiStyle
cuo :: Doc AnsiStyle
cuo = Doc AnsiStyle -> Doc AnsiStyle
annRed Doc AnsiStyle
"✘"
dui :: Doc AnsiStyle
dui :: Doc AnsiStyle
dui = Doc AnsiStyle -> Doc AnsiStyle
annGreen Doc AnsiStyle
"✔"
prettySkip :: [String] -> Doc AnsiStyle
prettySkip :: [String] -> Doc AnsiStyle
prettySkip = [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> ([String] -> [Doc AnsiStyle]) -> [String] -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> [Doc AnsiStyle] -> [Doc AnsiStyle]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc AnsiStyle
forall ann. Doc ann
comma ([Doc AnsiStyle] -> [Doc AnsiStyle])
-> ([String] -> [Doc AnsiStyle]) -> [String] -> [Doc AnsiStyle]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Doc AnsiStyle) -> [String] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Magenta) (Doc AnsiStyle -> Doc AnsiStyle)
-> (String -> Doc AnsiStyle) -> String -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty)
prettyFlagAssignments :: Map.Map PackageName FlagAssignment -> Doc AnsiStyle
prettyFlagAssignments :: Map PackageName FlagAssignment -> Doc AnsiStyle
prettyFlagAssignments Map PackageName FlagAssignment
m =
[Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> [Doc AnsiStyle] -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$
([(PackageName, FlagAssignment)] -> [Doc AnsiStyle])
-> (Map PackageName FlagAssignment
-> [(PackageName, FlagAssignment)])
-> Map PackageName FlagAssignment
-> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((PackageName, FlagAssignment) -> Doc AnsiStyle)
-> [(PackageName, FlagAssignment)] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(PackageName
n, FlagAssignment
a) -> Doc AnsiStyle -> Doc AnsiStyle
annMagneta (PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
n) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (FlagAssignment -> Doc AnsiStyle
prettyFlagAssignment FlagAssignment
a))) Map PackageName FlagAssignment -> [(PackageName, FlagAssignment)]
forall k a. Map k a -> [(k, a)]
Map.toList Map PackageName FlagAssignment
m
prettyFlagAssignment :: FlagAssignment -> Doc AnsiStyle
prettyFlagAssignment :: FlagAssignment -> Doc AnsiStyle
prettyFlagAssignment = [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> (FlagAssignment -> [Doc AnsiStyle])
-> FlagAssignment
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((FlagName, Bool) -> Doc AnsiStyle)
-> [(FlagName, Bool)] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(FlagName
n, Bool
v) -> Doc AnsiStyle
"⚐" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Yellow) (FlagName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty FlagName
n) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
colon Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Cyan) (Bool -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Bool
v)) ([(FlagName, Bool)] -> [Doc AnsiStyle])
-> (FlagAssignment -> [(FlagName, Bool)])
-> FlagAssignment
-> [Doc AnsiStyle]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlagAssignment -> [(FlagName, Bool)]
unFlagAssignment
prettyDeps :: [PackageName] -> Doc AnsiStyle
prettyDeps :: [PackageName] -> Doc AnsiStyle
prettyDeps =
[Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep
([Doc AnsiStyle] -> Doc AnsiStyle)
-> ([PackageName] -> [Doc AnsiStyle])
-> [PackageName]
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, PackageName) -> Doc AnsiStyle)
-> [(Int, PackageName)] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Int
i :: Int, PackageName
n) -> Int -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Int
i Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
dot Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
n)
([(Int, PackageName)] -> [Doc AnsiStyle])
-> ([PackageName] -> [(Int, PackageName)])
-> [PackageName]
-> [Doc AnsiStyle]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [PackageName] -> [(Int, PackageName)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 ..]
prettyFlags :: [(PackageName, [PkgFlag])] -> Doc AnsiStyle
prettyFlags :: [(PackageName, [PkgFlag])] -> Doc AnsiStyle
prettyFlags = [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> ([(PackageName, [PkgFlag])] -> [Doc AnsiStyle])
-> [(PackageName, [PkgFlag])]
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((PackageName, [PkgFlag]) -> Doc AnsiStyle)
-> [(PackageName, [PkgFlag])] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(PackageName
name, [PkgFlag]
flags) -> Doc AnsiStyle -> Doc AnsiStyle
annMagneta (PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
name) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 ([Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep (PkgFlag -> Doc AnsiStyle
prettyFlag (PkgFlag -> Doc AnsiStyle) -> [PkgFlag] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PkgFlag]
flags)))
prettyFlag :: PkgFlag -> Doc AnsiStyle
prettyFlag :: PkgFlag -> Doc AnsiStyle
prettyFlag PkgFlag
f =
Doc AnsiStyle
"⚐" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
annYellow Doc AnsiStyle
name Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
colon Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line
Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
indent
Int
4
( [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep
[ Doc AnsiStyle
"description" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
colon Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc AnsiStyle
desc,
Doc AnsiStyle
"default" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
colon Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
def,
Doc AnsiStyle
"isManual" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
colon Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
manual
]
)
where
name :: Doc AnsiStyle
name = FlagName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty (FlagName -> Doc AnsiStyle)
-> (PkgFlag -> FlagName) -> PkgFlag -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PkgFlag -> FlagName
flagName (PkgFlag -> Doc AnsiStyle) -> PkgFlag -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PkgFlag
f
desc :: Doc AnsiStyle
desc = String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc AnsiStyle) -> String -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PkgFlag -> String
flagDescription PkgFlag
f
def :: Doc AnsiStyle
def = Bool -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow (Bool -> Doc AnsiStyle) -> Bool -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PkgFlag -> Bool
flagDefault PkgFlag
f
manual :: Doc AnsiStyle
manual = Bool -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow (Bool -> Doc AnsiStyle) -> Bool -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PkgFlag -> Bool
flagManual PkgFlag
f
prettySolvedPkgs :: [SolvedPackage] -> T.Text
prettySolvedPkgs :: [SolvedPackage] -> Text
prettySolvedPkgs = [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
align2col ([(Doc AnsiStyle, Doc AnsiStyle)] -> Text)
-> ([SolvedPackage] -> [(Doc AnsiStyle, Doc AnsiStyle)])
-> [SolvedPackage]
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[(Doc AnsiStyle, Doc AnsiStyle)]]
-> [(Doc AnsiStyle, Doc AnsiStyle)]
forall a. Monoid a => [a] -> a
mconcat ([[(Doc AnsiStyle, Doc AnsiStyle)]]
-> [(Doc AnsiStyle, Doc AnsiStyle)])
-> ([SolvedPackage] -> [[(Doc AnsiStyle, Doc AnsiStyle)]])
-> [SolvedPackage]
-> [(Doc AnsiStyle, Doc AnsiStyle)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)])
-> [SolvedPackage] -> [[(Doc AnsiStyle, Doc AnsiStyle)]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)]
prettySolvedPkg
prettySolvedPkg :: SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)]
prettySolvedPkg :: SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)]
prettySolvedPkg SolvedPackage {[SolvedDependency]
PackageName
_pkgDeps :: SolvedPackage -> [SolvedDependency]
_pkgName :: SolvedPackage -> PackageName
_pkgDeps :: [SolvedDependency]
_pkgName :: PackageName
..} =
(Doc AnsiStyle -> Doc AnsiStyle
annYellow (Doc AnsiStyle -> Doc AnsiStyle)
-> (PackageName -> Doc AnsiStyle) -> PackageName -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annBold (Doc AnsiStyle -> Doc AnsiStyle)
-> (PackageName -> Doc AnsiStyle) -> PackageName -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty (PackageName -> Doc AnsiStyle) -> PackageName -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PackageName
_pkgName, Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
indent Int
16 Doc AnsiStyle
cuo) (Doc AnsiStyle, Doc AnsiStyle)
-> [(Doc AnsiStyle, Doc AnsiStyle)]
-> [(Doc AnsiStyle, Doc AnsiStyle)]
forall a. a -> [a] -> [a]
:
((Int, SolvedDependency) -> (Doc AnsiStyle, Doc AnsiStyle))
-> [(Int, SolvedDependency)] -> [(Doc AnsiStyle, Doc AnsiStyle)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
( \(Int
i :: Int, SolvedDependency {[DependencyType]
Maybe DependencyProvider
PackageName
_depType :: SolvedDependency -> [DependencyType]
_depName :: SolvedDependency -> PackageName
_depProvider :: SolvedDependency -> Maybe DependencyProvider
_depType :: [DependencyType]
_depName :: PackageName
_depProvider :: Maybe DependencyProvider
..}) ->
let prefix :: Doc AnsiStyle
prefix = if Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [SolvedDependency] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [SolvedDependency]
_pkgDeps then Doc AnsiStyle
" └─" else Doc AnsiStyle
" ├─"
in case Maybe DependencyProvider
_depProvider of
(Just DependencyProvider
x) -> (Doc AnsiStyle -> Doc AnsiStyle
annGreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
prefix Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
_depName Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann
parens ([Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> [Doc AnsiStyle] -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle -> [Doc AnsiStyle] -> [Doc AnsiStyle]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc AnsiStyle
forall ann. Doc ann
comma (DependencyType -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow (DependencyType -> Doc AnsiStyle)
-> [DependencyType] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [DependencyType]
_depType)), Doc AnsiStyle
dui Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
annCyan (DependencyProvider -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
x))
Maybe DependencyProvider
_ -> (Doc AnsiStyle -> Doc AnsiStyle
annYellow (Doc AnsiStyle -> Doc AnsiStyle)
-> (Doc AnsiStyle -> Doc AnsiStyle)
-> Doc AnsiStyle
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annBold (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
prefix Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
_depName Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann
parens ([Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> [Doc AnsiStyle] -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle -> [Doc AnsiStyle] -> [Doc AnsiStyle]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc AnsiStyle
forall ann. Doc ann
comma (DependencyType -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow (DependencyType -> Doc AnsiStyle)
-> [DependencyType] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [DependencyType]
_depType)), Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
indent Int
16 Doc AnsiStyle
cuo)
)
([Int] -> [SolvedDependency] -> [(Int, SolvedDependency)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 ..] [SolvedDependency]
_pkgDeps)
prettySolvedPkg ProvidedPackage {PackageName
DependencyProvider
_pkgProvider :: SolvedPackage -> DependencyProvider
_pkgProvider :: DependencyProvider
_pkgName :: PackageName
_pkgName :: SolvedPackage -> PackageName
..} = [(Doc AnsiStyle -> Doc AnsiStyle
annGreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
_pkgName, Doc AnsiStyle
dui Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
annCyan (DependencyProvider -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
_pkgProvider))]
render :: Doc AnsiStyle -> T.Text
render :: Doc AnsiStyle -> Text
render = SimpleDocStream AnsiStyle -> Text
renderStrict (SimpleDocStream AnsiStyle -> Text)
-> (Doc AnsiStyle -> SimpleDocStream AnsiStyle)
-> Doc AnsiStyle
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutOptions -> Doc AnsiStyle -> SimpleDocStream AnsiStyle
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
layoutPretty LayoutOptions
defaultLayoutOptions
viaPretty :: DPretty.Pretty a => a -> Doc AnsiStyle
viaPretty :: a -> Doc AnsiStyle
viaPretty = String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc AnsiStyle) -> (a -> String) -> a -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Pretty a => a -> String
prettyShow
align2col :: [(Doc AnsiStyle, Doc AnsiStyle)] -> T.Text
align2col :: [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
align2col (((Doc AnsiStyle, Doc AnsiStyle) -> (Text, Text))
-> [(Doc AnsiStyle, Doc AnsiStyle)] -> [(Text, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Doc AnsiStyle -> Identity Text)
-> (Doc AnsiStyle, Doc AnsiStyle) -> Identity (Text, Text)
forall a b. Traversal (a, a) (b, b) a b
both ((Doc AnsiStyle -> Identity Text)
-> (Doc AnsiStyle, Doc AnsiStyle) -> Identity (Text, Text))
-> (Doc AnsiStyle -> Text)
-> (Doc AnsiStyle, Doc AnsiStyle)
-> (Text, Text)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Doc AnsiStyle -> Text
render) -> [(Text, Text)]
l) = [Text] -> Text
T.concat [Text]
complemented
where
maxL :: Int
maxL = [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum ([Int] -> Int) -> [Int] -> Int
forall a b. (a -> b) -> a -> b
$ ((Text, Text) -> Int) -> [(Text, Text)] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> Int
T.length (Text -> Int) -> ((Text, Text) -> Text) -> (Text, Text) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, Text) -> Text
forall a b. (a, b) -> a
fst) [(Text, Text)]
l
complemented :: [Text]
complemented = (\(Text
x, Text
y) -> Text
x Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text -> Text
T.replicate (Int
maxL Int -> Int -> Int
forall a. Num a => a -> a -> a
- Text -> Int
T.length Text
x) Text
" " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
y Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\n") ((Text, Text) -> Text) -> [(Text, Text)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(Text, Text)]
l
ppSysDependencies :: Map.Map PackageName [SystemDependency] -> T.Text
ppSysDependencies :: Map PackageName [SystemDependency] -> Text
ppSysDependencies Map PackageName [SystemDependency]
m = [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
align2col ([(Doc AnsiStyle, Doc AnsiStyle)] -> Text)
-> [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
forall a b. (a -> b) -> a -> b
$ (PackageName
-> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle))
-> (PackageName, [SystemDependency])
-> (Doc AnsiStyle, Doc AnsiStyle)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle)
ppSysDependency ((PackageName, [SystemDependency])
-> (Doc AnsiStyle, Doc AnsiStyle))
-> [(PackageName, [SystemDependency])]
-> [(Doc AnsiStyle, Doc AnsiStyle)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map PackageName [SystemDependency]
-> [(PackageName, [SystemDependency])]
forall k a. Map k a -> [(k, a)]
Map.toList Map PackageName [SystemDependency]
m
ppSysDependency :: PackageName -> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle)
ppSysDependency :: PackageName -> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle)
ppSysDependency PackageName
name [SystemDependency]
deps = ((Doc AnsiStyle -> Doc AnsiStyle
annBold (Doc AnsiStyle -> Doc AnsiStyle)
-> (Doc AnsiStyle -> Doc AnsiStyle)
-> Doc AnsiStyle
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annYellow (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ PackageName -> Doc AnsiStyle
forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
name) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
colon, [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> [Doc AnsiStyle] -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle -> [Doc AnsiStyle] -> [Doc AnsiStyle]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc AnsiStyle
forall ann. Doc ann
comma ((SystemDependency -> Doc AnsiStyle)
-> [SystemDependency] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(SystemDependency String
x) -> String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty String
x) [SystemDependency]
deps))
ppDiffColored :: Diff [String] -> [Doc AnsiStyle]
ppDiffColored :: Diff [String] -> [Doc AnsiStyle]
ppDiffColored (First [String]
x) = Doc AnsiStyle -> Doc AnsiStyle
annRed (Doc AnsiStyle -> Doc AnsiStyle)
-> (String -> Doc AnsiStyle) -> String -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc AnsiStyle) -> [String] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
x
ppDiffColored (Second [String]
x) = Doc AnsiStyle -> Doc AnsiStyle
annGreen (Doc AnsiStyle -> Doc AnsiStyle)
-> (String -> Doc AnsiStyle) -> String -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc AnsiStyle) -> [String] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
x
ppDiffColored (Both [String]
x [String]
_) = String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc AnsiStyle) -> [String] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
x
splitLine :: Doc AnsiStyle
splitLine :: Doc AnsiStyle
splitLine = Doc AnsiStyle
forall ann. Doc ann
line Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> String -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
38 Char
'-') Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line
ppFromTo :: Int -> Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
ppFromTo :: Int -> Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
ppFromTo Int
i Doc AnsiStyle
a Doc AnsiStyle
b = Doc AnsiStyle
a Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hcat (Int -> Doc AnsiStyle -> [Doc AnsiStyle]
forall a. Int -> a -> [a]
replicate Int
i Doc AnsiStyle
forall ann. Doc ann
space) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
"⇒" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hcat (Int -> Doc AnsiStyle -> [Doc AnsiStyle]
forall a. Int -> a -> [a]
replicate Int
i Doc AnsiStyle
forall ann. Doc ann
space) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
b
printInfo :: (MonadIO m) => Doc AnsiStyle -> m ()
printInfo :: Doc AnsiStyle -> m ()
printInfo Doc AnsiStyle
msg = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc (Doc AnsiStyle -> IO ())
-> (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annBlue (Doc AnsiStyle -> m ()) -> Doc AnsiStyle -> m ()
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
"ⓘ" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line
ppCommunity :: Doc AnsiStyle
= Doc AnsiStyle -> Doc AnsiStyle
annCyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ DependencyProvider -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
ByCommunity
ppDBKind :: DBKind -> Doc AnsiStyle
ppDBKind :: DBKind -> Doc AnsiStyle
ppDBKind DBKind
x = Doc AnsiStyle -> Doc AnsiStyle
annCyan (Doc AnsiStyle -> Doc AnsiStyle)
-> (Doc AnsiStyle -> Doc AnsiStyle)
-> Doc AnsiStyle
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann
brackets (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ DBKind -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow DBKind
x
ppAur :: Doc AnsiStyle
ppAur :: Doc AnsiStyle
ppAur = Doc AnsiStyle -> Doc AnsiStyle
annCyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ DependencyProvider -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
ByAur
printWarn :: (MonadIO m) => Doc AnsiStyle -> m ()
printWarn :: Doc AnsiStyle -> m ()
printWarn Doc AnsiStyle
msg = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc (Doc AnsiStyle -> IO ())
-> (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annYellow (Doc AnsiStyle -> m ()) -> Doc AnsiStyle -> m ()
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
"⚠" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line
printError :: (MonadIO m) => Doc AnsiStyle -> m ()
printError :: Doc AnsiStyle -> m ()
printError Doc AnsiStyle
msg = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc (Doc AnsiStyle -> IO ())
-> (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annRed (Doc AnsiStyle -> m ()) -> Doc AnsiStyle -> m ()
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
"🛑" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line
printSuccess :: (MonadIO m) => Doc AnsiStyle -> m ()
printSuccess :: Doc AnsiStyle -> m ()
printSuccess Doc AnsiStyle
msg = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc (Doc AnsiStyle -> IO ())
-> (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annGreen (Doc AnsiStyle -> m ()) -> Doc AnsiStyle -> m ()
forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
dui Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line