Options.Applicative.Help
- Package
- purescript-optparse
- Repository
- f-o-a-m/purescript-optparse
This is an empty module which re-exports the help text system for optparse.
Re-exports from Options.Applicative.Help.Chunk
#stringChunk Source
stringChunk :: String -> Chunk Doc
Convert a 'String' into a 'Chunk'. This satisfies:
#listToChunk Source
listToChunk :: forall a. Monoid a => Array a -> Chunk a
Concatenate a list into a Chunk. 'listToChunk' satisfies:
#extractChunk Source
extractChunk :: forall a. Monoid a => Chunk a -> a
Part of a constrained comonad instance.
#(<</>>) Source
Operator alias for Options.Applicative.Help.Chunk.chunkBesideOrBelow (right-associative / precedence 6)
#(<<+>>) Source
Operator alias for Options.Applicative.Help.Chunk.chunkBeside (right-associative / precedence 6)
Re-exports from Options.Applicative.Help.Core
#suggestionsHelp Source
suggestionsHelp :: Chunk Doc -> ParserHelp
#parserUsage Source
parserUsage :: forall a. ParserPrefs -> Parser a -> String -> Doc
Generate option summary.
#parserHelp Source
parserHelp :: forall a. ParserPrefs -> Parser a -> ParserHelp
Generate the help text for a program.
#missingDesc Source
missingDesc :: forall a. ParserPrefs -> Parser a -> Chunk Doc
Generate a brief help text for a parser, only including mandatory
#headerHelp Source
headerHelp :: Chunk Doc -> ParserHelp
#fullDesc Source
fullDesc :: forall a. ParserPrefs -> Parser a -> Chunk Doc
Generate a full help text for a parser.
#briefDesc Source
briefDesc :: forall a. ParserPrefs -> Parser a -> Chunk Doc
Generate a brief help text for a parser.
Re-exports from Options.Applicative.Help.Levenshtein
Re-exports from Options.Applicative.Help.Pretty
#SimpleDoc Source
data SimpleDoc
The data type @SimpleDoc@ represents rendered documents and is used by the display functions.
Whereas values of the data type 'Doc' represent non-empty sets of possible renderings of a document, values of the data type @SimpleDoc@ represent single renderings of a document.
The @Int@ in @SText@ contains the length of the string. The @Int@ in @SLine@ contains the indentation for that line. The library provides two default display functions 'displayS' and 'displayIO'. You can provide your own display function by writing a function from a @SimpleDoc@ to your own output format.
Constructors
Instances
#Doc Source
data Doc
The abstract data type @Doc@ represents pretty documents.
More specifically, a value of type @Doc@ represents a non-empty set of possible renderings of a document. The rendering functions select one of these possibilities.
@Doc@ is an instance of the 'Show' class. @(show doc)@ pretty prints document @doc@ with a page width of 80 characters and a ribbon width of 32 characters.
show (text "hello" <$> text "world")
Which would return the string "hello\nworld", i.e.
@ hello world @
Constructors
Fail
Empty
Char Char
Text Int String
Line
FlatAlt Doc Doc
Cat Doc Doc
Nest Int Doc
Union Doc Doc
Column (Int -> Doc)
Columns (Maybe Int -> Doc)
Nesting (Int -> Doc)
Instances
#vsep Source
vsep :: Array Doc -> Doc
The document @(vsep xs)@ concatenates all documents @xs@ vertically with @(<$>)@. If a 'group' undoes the line breaks inserted by @vsep@, all documents are separated with a space.
someText = map text (words ("text to lay out"))
test = text "some" <+> vsep someText
This is layed out as:
@ some text to lay out @
The 'align' combinator can be used to align the documents under their first element
test = text "some" <+> align (vsep someText)
Which is printed as:
@ some text to lay out @
#semiBraces Source
semiBraces :: Array Doc -> Doc
The document @(semiBraces xs)@ separates the documents @xs@ with semicolons and encloses them in braces. The documents are rendered horizontally if that fits the page. Otherwise they are aligned vertically. All semicolons are put in front of the elements.
#renderSmart Source
renderSmart :: Number -> Int -> Doc -> SimpleDoc
A slightly smarter rendering algorithm with more lookahead. It provides provide earlier breaking on deeply nested structures For example, consider this python-ish pseudocode: @fun(fun(fun(fun(fun([abcdefg, abcdefg])))))@ If we put a softbreak (+ nesting 2) after each open parenthesis, and align the elements of the list to match the opening brackets, this will render with @renderPretty@ and a page width of 20 as: @ fun(fun(fun(fun(fun([ | abcdef, | abcdef, ] ))))) | @ Where the 20c. boundary has been marked with |. Because @renderPretty@ only uses one-line lookahead, it sees that the first line fits, and is stuck putting the second and third lines after the 20-c mark. In contrast, @renderSmart@ will continue to check that the potential document up to the end of the indentation level. Thus, it will format the document as:
@ fun( | fun( | fun( | fun( | fun([ | abcdef, abcdef, ] | ))))) | @ Which fits within the 20c. boundary.
#renderPretty Source
renderPretty :: Number -> Int -> Doc -> SimpleDoc
This is the default pretty printer which is used by 'show', 'putDoc' and 'hPutDoc'. @(renderPretty ribbonfrac width x)@ renders document @x@ with a page width of @width@ and a ribbon width of @(ribbonfrac * width)@ characters. The ribbon width is the maximal amount of non-indentation characters on a line. The parameter @ribbonfrac@ should be between @0.0@ and @1.0@. If it is lower or higher, the ribbon width will be 0 or @width@ respectively.
#renderFits Source
renderFits :: (Int -> Int -> Int -> LazySimpleDoc -> Boolean) -> Number -> Int -> Doc -> SimpleDoc
#renderCompact Source
renderCompact :: Doc -> SimpleDoc
@(renderCompact x)@ renders document @x@ without adding any indentation. Since no 'pretty' printing is involved, this renderer is very fast. The resulting output contains fewer characters than a pretty printed version and can be used for output that is read by other programs.
This rendering function does not add any colorisation information.
#punctuate Source
punctuate :: Doc -> Array Doc -> Array Doc
@(punctuate p xs)@ concatenates all documents in @xs@ with document @p@ except for the last document.
someText = map text ["words","in","a","tuple"] test = parens (align (cat (punctuate comma someText)))
This is layed out on a page width of 20 as:
@ (words,in,a,tuple) @
But when the page width is 15, it is layed out as:
@ (words, in, a, tuple) @
(If you want put the commas in front of their elements instead of at the end, you should use 'tupled' or, in general, 'encloseSep'.)
#indentation Source
indentation :: Int -> String
#hang Source
hang :: Int -> Doc -> Doc
The hang combinator implements hanging indentation. The document @(hang i x)@ renders document @x@ with a nesting level set to the current column plus @i@. The following example uses hanging indentation for some text:
test = hang 4 (fillSep (map text (words "the hang combinator indents these words !")))
Which lays out on a page with a width of 20 characters as:
@ the hang combinator indents these words ! @
The @hang@ combinator is implemented as:
hang i x = align (nest i x)
#fitsR Source
fitsR :: Int -> Int -> Int -> LazySimpleDoc -> Boolean
@fitsR@ has a little more lookahead: assuming that nesting roughly corresponds to syntactic depth, @fitsR@ checks that not only the current line fits, but the entire syntactic structure being formatted at this level of indentation fits. If we were to remove the second case for @SLine@, we would check that not only the current structure fits, but also the rest of the document, which would be slightly more intelligent but would have exponential runtime (and is prohibitively expensive in practice). p = pagewidth m = minimum nesting level to fit in w = the width in which to fit the first line
#fillBreak Source
fillBreak :: Int -> Doc -> Doc
The document @(fillBreak i x)@ first renders document @x@. It than appends @space@s until the width is equal to @i@. If the width of @x@ is already larger than @i@, the nesting level is increased by @i@ and a @line@ is appended. When we redefine @ptype@ in the previous example to use @fillBreak@, we get a useful variation of the previous output:
ptype (name,tp) = fillBreak 6 (text name) <+> text "::" <+> text tp
The output will now be:
@ let empty :: Doc nest :: Int -> Doc -> Doc linebreak :: Doc @
#fill Source
fill :: Int -> Doc -> Doc
The document @(fill i x)@ renders document @x@. It than appends @space@s until the width is equal to @i@. If the width of @x@ is already larger, nothing is appended. This combinator is quite useful in practice to output a list of bindings. The following example demonstrates this.
types = [("empty","Doc") ,("nest","Int -> Doc -> Doc") ,("linebreak","Doc")]
ptype (name,tp) = fill 6 (text name) <+> text "::" <+> text tp
test = text "let" <+> align (vcat (map ptype types))
Which is layed out as:
@ let empty :: Doc nest :: Int -> Doc -> Doc linebreak :: Doc @
#encloseSep Source
encloseSep :: Doc -> Doc -> Doc -> Array Doc -> Doc
The document @(encloseSep l r sep xs)@ concatenates the documents @xs@ separated by @sep@ and encloses the resulting document by @l@ and @r@. The documents are rendered horizontally if that fits the page. Otherwise they are aligned vertically. All separators are put in front of the elements. For example, the combinator 'list' can be defined with @encloseSep@:
list xs = encloseSep lbracket rbracket comma xs test = text "list" <+> (list (map int [10,200,3000]))
Which is layed out with a page width of 20 as:
@ list [10,200,3000] @
But when the page width is 15, it is layed out as:
@ list [10 ,200 ,3000] @
#displayS Source
displayS :: SimpleDoc -> String
@(displayS simpleDoc)@ takes the output @simpleDoc@ from a rendering function and transforms it to a 'ShowS' type (for use in the 'Show' class).
showWidth :: Int -> Doc -> String showWidth w x = displayS (renderPretty 0.4 w x) ""
ANSI color information will be discarded by this function unless you are running on a Unix-like operating system. This is due to a technical limitation in Windows ANSI support.
#appendWithSpace Source
appendWithSpace :: Doc -> Doc -> Doc
The document @(x <+> y)@ concatenates document @x@ and @y@ with a @space@ in between. (infixr 6)
#appendWithSoftline Source
appendWithSoftline :: Doc -> Doc -> Doc
The document @(x </> y)@ concatenates document @x@ and @y@ with a 'softline' in between. This effectively puts @x@ and @y@ either next to each other (with a @space@ in between) or underneath each other. (infixr 5)
#appendWithSoftbreak Source
appendWithSoftbreak :: Doc -> Doc -> Doc
The document @(x <//> y)@ concatenates document @x@ and @y@ with a 'softbreak' in between. This effectively puts @x@ and @y@ either right next to each other or underneath each other. (infixr 5)
#appendWithLinebreak Source
appendWithLinebreak :: Doc -> Doc -> Doc
The document @(x <$$> y)@ concatenates document @x@ and @y@ with a @linebreak@ in between. (infixr 5)
#appendWithLine Source
appendWithLine :: Doc -> Doc -> Doc
The document @(x <$> y)@ concatenates document @x@ and @y@ with a 'line' in between. (infixr 5)
#align Source
align :: Doc -> Doc
The document @(align x)@ renders document @x@ with the nesting level set to the current column. It is used for example to implement 'hang'.
As an example, we will put a document right above another one, regardless of the current nesting level:
x $$ y = align (x <$> y)
test = text "hi" <+> (text "nice" $$ text "world")
which will be layed out as:
@ hi nice world @
#(</>) Source
Operator alias for Text.PrettyPrint.Leijen.appendWithSoftline (right-associative / precedence 5)
#(<//>) Source
Operator alias for Text.PrettyPrint.Leijen.appendWithSoftbreak (right-associative / precedence 5)
#(<+>) Source
Operator alias for Text.PrettyPrint.Leijen.appendWithSpace (right-associative / precedence 6)
#(<$$>) Source
Operator alias for Text.PrettyPrint.Leijen.appendWithLinebreak (right-associative / precedence 5)
#(.$.) Source
Operator alias for Text.PrettyPrint.Leijen.appendWithLine (right-associative / precedence 5)
Re-exports from Options.Applicative.Help.Types
#ParserHelp Source
#renderHelp Source
renderHelp :: Int -> ParserHelp -> String
Convert a help text to 'String'.
- Modules
- Options.
Applicative - Options.
Applicative. BashCompletion - Options.
Applicative. Builder - Options.
Applicative. Builder. Completer - Options.
Applicative. Builder. Internal - Options.
Applicative. Common - Options.
Applicative. Extra - Options.
Applicative. Help - Options.
Applicative. Help. Chunk - Options.
Applicative. Help. Core - Options.
Applicative. Help. Levenshtein - Options.
Applicative. Help. Pretty - Options.
Applicative. Help. Types - Options.
Applicative. Internal - Options.
Applicative. Internal. Utils - Options.
Applicative. Types - Text.
PrettyPrint. Leijen