{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ViewPatterns #-}

-- | Copyright: (c) 2020 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <berberman@yandex.com>
-- Stability: experimental
-- Portability: portable
-- This module provides simple pretty-printing functions work with the cli program.
module Distribution.ArchHs.PP
  ( prettySkip,
    prettyFlagAssignments,
    prettyFlags,
    prettySolvedPkgs,
    prettyDeps,
    ppSysDependencies,
    ppDiffColored,
    align2col,
    dui,
    cuo,
    ppCommunity,
    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.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, [Flag])] -> Doc AnsiStyle
prettyFlags :: [(PackageName, [Flag])] -> Doc AnsiStyle
prettyFlags = [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
vsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> ([(PackageName, [Flag])] -> [Doc AnsiStyle])
-> [(PackageName, [Flag])]
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((PackageName, [Flag]) -> Doc AnsiStyle)
-> [(PackageName, [Flag])] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(PackageName
name, [Flag]
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 (Flag -> Doc AnsiStyle
prettyFlag (Flag -> Doc AnsiStyle) -> [Flag] -> [Doc AnsiStyle]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Flag]
flags)))

prettyFlag :: Flag -> Doc AnsiStyle
prettyFlag :: Flag -> Doc AnsiStyle
prettyFlag Flag
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)
-> (Flag -> FlagName) -> Flag -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Flag -> FlagName
flagName (Flag -> Doc AnsiStyle) -> Flag -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ Flag
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
$ Flag -> String
flagDescription Flag
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
$ Flag -> Bool
flagDefault Flag
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
$ Flag -> Bool
flagManual Flag
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
<+> [DependencyType] -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow [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
<+> [DependencyType] -> Doc AnsiStyle
forall a ann. Show a => a -> Doc ann
viaShow [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) => T.Text -> m ()
printInfo :: Text -> m ()
printInfo Text
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
<+> Text -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Text
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line

ppCommunity :: Doc AnsiStyle
ppCommunity :: Doc AnsiStyle
ppCommunity = 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

printWarn :: (MonadIO m) => T.Text -> m ()
printWarn :: Text -> m ()
printWarn Text
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
<+> Text -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Text
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line

printError :: (MonadIO m) => T.Text -> m ()
printError :: Text -> m ()
printError Text
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
<+> Text -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Text
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line

printSuccess :: (MonadIO m) => T.Text -> m ()
printSuccess :: Text -> m ()
printSuccess Text
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
<+> Text -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Text
msg Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
forall ann. Doc ann
line