module Hinit.Utils where

import Data.Text (Text)
import Data.Text.Prettyprint.Doc
import Data.Text.Prettyprint.Doc.Render.Terminal
import System.FilePath.Glob

mkBulletList :: [Doc a] -> Doc a
mkBulletList :: [Doc a] -> Doc a
mkBulletList = [Doc a] -> Doc a
forall ann. [Doc ann] -> Doc ann
vsep ([Doc a] -> Doc a) -> ([Doc a] -> [Doc a]) -> [Doc a] -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Doc a -> Doc a) -> [Doc a] -> [Doc a]
forall a b. (a -> b) -> [a] -> [b]
map ((Doc a
"•" Doc a -> Doc a -> Doc a
forall ann. Doc ann -> Doc ann -> Doc ann
<+>) (Doc a -> Doc a) -> (Doc a -> Doc a) -> Doc a -> Doc a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Doc a -> Doc a
forall ann. Int -> Doc ann -> Doc ann
nest Int
2)

mkError :: Doc AnsiStyle -> Doc AnsiStyle
mkError :: Doc AnsiStyle -> Doc AnsiStyle
mkError Doc AnsiStyle
doc = AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Red) Doc AnsiStyle
"Error:" Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 Doc AnsiStyle
doc

readYesNo :: Text -> Maybe Bool
readYesNo :: Text -> Maybe Bool
readYesNo Text
s =
  if
      | Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"Y" Bool -> Bool -> Bool
|| Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"y" Bool -> Bool -> Bool
|| Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"Yes" Bool -> Bool -> Bool
|| Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"yes" -> Bool -> Maybe Bool
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure Bool
True
      | Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"N" Bool -> Bool -> Bool
|| Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"n" Bool -> Bool -> Bool
|| Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"No" Bool -> Bool -> Bool
|| Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"no" -> Bool -> Maybe Bool
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure Bool
False
      | Bool
otherwise -> Maybe Bool
forall a. Maybe a
Nothing

newtype PrettyShow a = PrettyShow {PrettyShow a -> a
unPrettyShow :: a}

instance Pretty a => Show (PrettyShow a) where
  show :: PrettyShow a -> String
show = Doc Any -> String
forall a. Show a => a -> String
show (Doc Any -> String)
-> (PrettyShow a -> Doc Any) -> PrettyShow a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
pretty (a -> Doc Any) -> (PrettyShow a -> a) -> PrettyShow a -> Doc Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrettyShow a -> a
forall a. PrettyShow a -> a
unPrettyShow

matches :: [Pattern] -> FilePath -> Bool
matches :: [Pattern] -> String -> Bool
matches [Pattern]
ps String
fp = [Bool] -> Bool
forall (t :: Type -> Type). Foldable t => t Bool -> Bool
or ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (Pattern -> Bool) -> [Pattern] -> [Bool]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (Pattern -> String -> Bool
`match` String
fp) [Pattern]
ps

whenJust :: Applicative m => Maybe a -> (a -> m ()) -> m ()
whenJust :: Maybe a -> (a -> m ()) -> m ()
whenJust Maybe a
Nothing a -> m ()
_ = () -> m ()
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure ()
whenJust (Just a
a) a -> m ()
k = a -> m ()
k a
a