-- | Helpers for the @Examples@ footer in @--help@ output.
module PlutusCore.Executable.Help
  ( Example (..)
  , eg
  , examplesDoc
  , examplesFooter
  ) where

import Options.Applicative (InfoMod, footerDoc)
import Options.Applicative.Help.Pretty (Doc, concatWith, hardline, pretty)

data Example = Example
  { Example -> String
exampleDescription :: String
  , Example -> String
exampleCommand :: String
  }
  deriving stock (Example -> Example -> Bool
(Example -> Example -> Bool)
-> (Example -> Example -> Bool) -> Eq Example
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Example -> Example -> Bool
== :: Example -> Example -> Bool
$c/= :: Example -> Example -> Bool
/= :: Example -> Example -> Bool
Eq, Int -> Example -> ShowS
[Example] -> ShowS
Example -> String
(Int -> Example -> ShowS)
-> (Example -> String) -> ([Example] -> ShowS) -> Show Example
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Example -> ShowS
showsPrec :: Int -> Example -> ShowS
$cshow :: Example -> String
show :: Example -> String
$cshowList :: [Example] -> ShowS
showList :: [Example] -> ShowS
Show)

eg :: String -> String -> Example
eg :: String -> String -> Example
eg = String -> String -> Example
Example

examplesDoc :: [Example] -> Maybe Doc
examplesDoc :: [Example] -> Maybe Doc
examplesDoc [] = Maybe Doc
forall a. Maybe a
Nothing
examplesDoc [Example]
examples = Doc -> Maybe Doc
forall a. a -> Maybe a
Just ([Doc] -> Doc
forall {ann}. [Doc ann] -> Doc ann
joinLines (String -> Doc
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Examples:" Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: (Example -> [Doc]) -> [Example] -> [Doc]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Example -> [Doc]
forall {ann}. Example -> [Doc ann]
render [Example]
examples))
  where
    render :: Example -> [Doc ann]
render (Example String
desc String
cmd) =
      [ Doc ann
forall a. Monoid a => a
mempty
      , String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String
"  # " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
desc)
      , String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String
"  " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
cmd)
      ]
    joinLines :: [Doc ann] -> Doc ann
joinLines = (Doc ann -> Doc ann -> Doc ann) -> [Doc ann] -> Doc ann
forall (t :: * -> *) ann.
Foldable t =>
(Doc ann -> Doc ann -> Doc ann) -> t (Doc ann) -> Doc ann
concatWith (\Doc ann
x Doc ann
y -> Doc ann
x Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
y)

examplesFooter :: [Example] -> InfoMod a
examplesFooter :: forall a. [Example] -> InfoMod a
examplesFooter = Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
footerDoc (Maybe Doc -> InfoMod a)
-> ([Example] -> Maybe Doc) -> [Example] -> InfoMod a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Example] -> Maybe Doc
examplesDoc