-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Command-line interface for the hledger accounting tool
--   
--   This is hledger's command-line interface. Its basic function is to
--   read a plain text file describing financial transactions and produce
--   useful reports.
--   
--   hledger is a cross-platform program for tracking money, time, or any
--   other commodity, using double-entry accounting and a simple, editable
--   file format. It is inspired by and largely compatible with ledger(1).
--   hledger provides command-line, curses and web interfaces, and aims to
--   be a reliable, practical tool for daily use.
@package hledger
@version 1.12.1

-- | Embedded documentation files in various formats, and helpers for
--   viewing them.
--   
--   |
module Hledger.Cli.DocFiles
type Topic = String
docFiles :: [(Topic, (ByteString, ByteString, ByteString))]
docTopics :: [Topic]
lookupDocNroff :: Topic -> ByteString
lookupDocTxt :: Topic -> ByteString
lookupDocInfo :: Topic -> ByteString
printHelpForTopic :: Topic -> IO ()
runManForTopic :: Topic -> IO ()
runInfoForTopic :: Topic -> IO ()
runPagerForTopic :: FilePath -> Topic -> IO ()

module Hledger.Cli.Version
progname :: String
version :: String
prognameandversion :: String
prognameanddetailedversion :: String

-- | Given a program name, return a precise platform-specific executable
--   name suitable for naming downloadable binaries. Can raise an error if
--   the version and patch level was not defined correctly at build time.
binaryfilename :: String -> String

-- | Common cmdargs modes and flags, a command-line options type, and
--   related utilities used by hledger commands.
module Hledger.Cli.CliOptions

-- | Common help flags: --help, --debug, --version...
helpflags :: [Flag RawOpts]

-- | A hidden flag, just for the hledger executable.
detailedversionflag :: Flag RawOpts

-- | Common input-related flags: --file, --rules-file, --alias...
inputflags :: [Flag RawOpts]

-- | Common report-related flags: --period, --cost, etc.
reportflags :: [Flag RawOpts]

-- | Common output-related flags: --output-file, --output-format...
outputflags :: [Flag RawOpts]
outputFormatFlag :: Flag RawOpts
outputFileFlag :: Flag RawOpts
generalflagsgroup1 :: (String, [Flag RawOpts])
generalflagsgroup2 :: (String, [Flag RawOpts])
generalflagsgroup3 :: (String, [Flag RawOpts])

-- | An empty cmdargs mode to use as a template. Modes describe the
--   top-level command, ie the program, or a subcommand, telling cmdargs
--   how to parse a command line and how to generate the command's usage
--   text.
defMode :: Mode RawOpts

-- | A cmdargs mode suitable for a hledger built-in command with the given
--   names (primary name + optional aliases). The default flags are short
--   and long help (-h and --help). The usage message shows [QUERY] as
--   argument.
defCommandMode :: [Name] -> Mode RawOpts

-- | A cmdargs mode representing the hledger add-on command with the given
--   name. Like defCommandMode, but adds a appropriate short help message
--   if the addon name is recognised, and includes hledger's common
--   inputreportinghelp flags as default. Just used by hledger for
--   generating the commands list I think (or possibly for invoking the
--   addons as well ?)
quickAddonCommandMode :: Name -> Mode RawOpts

-- | Build a cmdarg mode for a hledger command, from a help template and
--   flag/argument specifications. Reduces boilerplate a little, though the
--   complicated cmdargs flag and argument specs are still required.
hledgerCommandMode :: HelpTemplate -> [Flag RawOpts] -> [(Help, [Flag RawOpts])] -> [Flag RawOpts] -> ([Arg RawOpts], Maybe (Arg RawOpts)) -> Mode RawOpts
argsFlag :: FlagHelp -> Arg RawOpts

-- | Get a mode's usage message as a nicely wrapped string.
showModeUsage :: Mode a -> String

-- | Add command aliases to the command's help string.
withAliases :: String -> [String] -> String

-- | Get all sorted unique filenames in the current user's PATH. We do not
--   currently filter out non-file objects or files without execute
--   permission.
likelyExecutablesInPath :: IO [String]

-- | Get the sorted unique filenames of all hledger-* executables in the
--   current user's PATH. These are files in any of the PATH directories,
--   named hledger-*, with either no extension (and no periods in the name)
--   or one of the addonExtensions. We do not currently filter out non-file
--   objects or files without execute permission.
hledgerExecutablesInPath :: IO [String]

-- | Command line options, used in the hledger package and above.
--   This is the "opts" used throughout hledger CLI code. representing the
--   options and arguments that were provided at startup on the
--   command-line.
data CliOpts
CliOpts :: RawOpts -> String -> [FilePath] -> InputOpts -> ReportOpts -> Maybe FilePath -> Maybe String -> Int -> Bool -> Maybe String -> Int -> CliOpts
[rawopts_] :: CliOpts -> RawOpts
[command_] :: CliOpts -> String
[file_] :: CliOpts -> [FilePath]
[inputopts_] :: CliOpts -> InputOpts
[reportopts_] :: CliOpts -> ReportOpts
[output_file_] :: CliOpts -> Maybe FilePath
[output_format_] :: CliOpts -> Maybe String

-- | debug level, set by --debug[=N]. See also debugLevel.
[debug_] :: CliOpts -> Int
[no_new_accounts_] :: CliOpts -> Bool

-- | the --width value provided, if any
[width_] :: CliOpts -> Maybe String

-- | estimated usable screen width, based on 1. the COLUMNS env var, if set
--   2. the width reported by the terminal, if supported 3. the default
--   (80)
[available_width_] :: CliOpts -> Int
defcliopts :: CliOpts

-- | A helper for addon commands: this parses options and arguments from
--   the current command line using the given hledger-style cmdargs mode,
--   and returns a CliOpts. Or, with --help or -h present, it prints long
--   or short help, and exits the program. When --debug is present, also
--   prints some debug output. Note this is not used by the main hledger
--   executable.
--   
--   The help texts are generated from the mode. Long help includes the
--   full usage description generated by cmdargs (including all supported
--   options), framed by whatever pre- and postamble text the mode
--   specifies. It's intended that this forms a complete help document or
--   manual.
--   
--   Short help is a truncated version of the above: the preamble and the
--   first part of the usage, up to the first line containing "flags:"
--   (normally this marks the start of the common hledger flags); plus a
--   mention of --help and the (presumed supported) common hledger options
--   not displayed.
--   
--   Tips: Empty lines in the pre/postamble are removed by cmdargs; add a
--   space character to preserve them.
getHledgerCliOpts :: Mode RawOpts -> IO CliOpts

-- | Convert possibly encoded option values to regular unicode strings.
decodeRawOpts :: RawOpts -> RawOpts

-- | Parse raw option string values to the desired final data types. Any
--   relative smart dates will be converted to fixed dates based on today's
--   date. Parsing failures will raise an error. Also records the terminal
--   width, if supported.
rawOptsToCliOpts :: RawOpts -> IO CliOpts

-- | Do final validation of processed opts, raising an error if there is
--   trouble.
checkCliOpts :: CliOpts -> CliOpts
outputFormats :: [String]
defaultOutputFormat :: String

-- | Default line format for balance report: "%20(total)
--   %2(depth_spacer)%-(account)"
defaultBalanceLineFormat :: StringFormat

-- | Get the (tilde-expanded, absolute) journal file path from 1. options,
--   2. an environment variable, or 3. the default. Actually, returns one
--   or more file paths. There will be more than one if multiple -f options
--   were provided. File paths can have a READER: prefix naming a
--   reader/data format.
journalFilePathFromOpts :: CliOpts -> IO [String]

-- | Get the (tilde-expanded) rules file path from options, if any.
rulesFilePathFromOpts :: CliOpts -> IO (Maybe FilePath)

-- | Get the expanded, absolute output file path from options, or the
--   default (-, meaning stdout).
outputFileFromOpts :: CliOpts -> IO FilePath

-- | Get the output format from the --output-format option, otherwise from
--   a recognised file extension in the --output-file option, otherwise the
--   default (txt).
outputFormatFromOpts :: CliOpts -> String

-- | Default width for hledger console output, when not otherwise
--   specified.
defaultWidth :: Int

-- | Get the width in characters to use for console output. This comes from
--   the --width option, or the COLUMNS environment variable, or (on posix
--   platforms) the current terminal width, or 80. Will raise a parse error
--   for a malformed --width argument.
widthFromOpts :: CliOpts -> Int

-- | Replace any numeric flags (eg -2) with their long form (--depth 2), as
--   I'm guessing cmdargs doesn't support this directly.
replaceNumericFlags :: [String] -> [String]

-- | Get the width in characters to use for the register command's console
--   output, and also the description column width if specified (following
--   the main width, comma-separated). The widths will be as follows: 
--   no --width flag - overall width is the available width (COLUMNS, or
--   posix terminal width, or 80); description width is unspecified (auto)
--   --width W - overall width is W, description width is auto --width W,D
--   - overall width is W, description width is D  Will raise a parse
--   error for a malformed --width argument.
registerWidthsFromOpts :: CliOpts -> (Int, Maybe Int)

-- | Parse the format option if provided, possibly returning an error,
--   otherwise get the default value.
lineFormatFromOpts :: ReportOpts -> Either String StringFormat

-- | Get the sorted unique canonical names of hledger addon commands found
--   in the current user's PATH. These are used in command line parsing and
--   to display the commands list.
--   
--   Canonical addon names are the filenames of hledger-* executables in
--   PATH, without the "hledger-" prefix, and without the file extension
--   except when it's needed for disambiguation (see below).
--   
--   When there are exactly two versions of an executable (same base name,
--   different extensions) that look like a source and compiled pair (one
--   has .exe, .com, or no extension), the source version will be excluded
--   (even if it happens to be newer). When there are three or more
--   versions (or two versions that don't look like a source/compiled
--   pair), they are all included, with file extensions intact.
hledgerAddons :: IO [String]

-- | Get the most appropriate documentation topic for a mode. Currently,
--   that is either the hledger, hledger-ui, hledger-web or hledger-api
--   manual.
topicForMode :: Mode a -> Topic
instance Data.Data.Data Hledger.Cli.CliOptions.CliOpts
instance GHC.Show.Show Hledger.Cli.CliOptions.CliOpts
instance Data.Default.Class.Default Hledger.Cli.CliOptions.CliOpts

-- | Utilities for top-level modules and ghci. See also Hledger.Read and
--   Hledger.Utils.
module Hledger.Cli.Utils

-- | Parse the user's specified journal file(s) as a Journal, maybe apply
--   some transformations according to options, and run a hledger command
--   with it. Or, throw an error.
withJournalDo :: CliOpts -> (CliOpts -> Journal -> IO ()) -> IO ()

-- | Write some output to stdout or to a file selected by --output-file. If
--   the file exists it will be overwritten.
writeOutput :: CliOpts -> String -> IO ()

-- | Apply some transformations to the journal if specified by options.
--   These include:
--   
--   
--   
- adding forecast transactions (--forecast)
--   
- converting amounts to market value (--value)
--   
- pivoting account names (--pivot)
--   
- anonymising (--anonymise).
--   
journalTransform :: CliOpts -> Journal -> IO Journal

-- | If -V/--value was requested, convert all journal amounts to their
--   market value as of the report end date. Cf
--   http://hledger.org/manual.html#market-value Since 2017/4 we do
--   this early, before commands run, which affects all commands and seems
--   to have the same effect as doing it last on the reported values.
journalApplyValue :: ReportOpts -> Journal -> IO Journal

-- | Generate periodic transactions from all periodic transaction rules in
--   the journal. These transactions are added to the in-memory Journal
--   (but not the on-disk file).
--   
--   They start on or after the day following the latest normal transaction
--   in the journal, or today if there are none. They end on or before the
--   specified report end date, or 180 days from today if unspecified.
journalAddForecast :: CliOpts -> Journal -> IO Journal

-- | Re-read the journal file(s) specified by options, applying any
--   transformations specified by options. Or return an error string. Reads
--   the full journal, without filtering.
journalReload :: CliOpts -> IO (Either String Journal)

-- | Re-read the option-specified journal file(s), but only if any of them
--   has changed since last read. (If the file is standard input, this will
--   either do nothing or give an error, not tested yet). Returns a journal
--   or error message, and a flag indicating whether it was re-read or not.
--   Like withJournalDo and journalReload, reads the full journal, without
--   filtering.
journalReloadIfChanged :: CliOpts -> Day -> Journal -> IO (Either String Journal, Bool)

-- | Has the journal's main data file changed since the journal was last
--   read ?
journalFileIsNewer :: Journal -> IO Bool

-- | Has the specified file (presumably one of journal's data files)
--   changed since journal was last read ?
journalSpecifiedFileIsNewer :: Journal -> FilePath -> IO Bool

-- | Get the last modified time of the specified file, or if it does not
--   exist or there is some other error, the current time.
fileModificationTime :: FilePath -> IO ClockTime

-- | Attempt to open a web browser on the given url, all platforms.
openBrowserOn :: String -> IO ExitCode

-- | Back up this file with a (incrementing) numbered suffix, then
--   overwrite it with this new text, or give an error.
writeFileWithBackup :: FilePath -> String -> IO ()

-- | Back up this file with a (incrementing) numbered suffix then overwrite
--   it with this new text, or give an error, but only if the text is
--   different from the current file contents, and return a flag indicating
--   whether we did anything.
writeFileWithBackupIfChanged :: FilePath -> Text -> IO Bool
readFileStrictly :: FilePath -> IO Text

-- | Apply the pivot transformation on a journal, if option is present.
pivotByOpts :: CliOpts -> Journal -> Journal

-- | Apply the anonymisation transformation on a journal, if option is
--   present
anonymiseByOpts :: CliOpts -> Journal -> Journal

module Hledger.Cli.Commands.Tags
tagsmode :: Mode RawOpts
tags :: CliOpts -> Journal -> IO ()

-- | Print some statistics for the journal.
module Hledger.Cli.Commands.Stats
statsmode :: Mode RawOpts

-- | Print various statistics for the journal.
stats :: CliOpts -> Journal -> IO ()

-- | The roi command prints internal rate of return and
--   time-weighted rate of return for and investment.
module Hledger.Cli.Commands.Roi
roimode :: Mode RawOpts
roi :: CliOpts -> Journal -> IO ()
instance GHC.Show.Show Hledger.Cli.Commands.Roi.OneSpan

-- | A ledger-compatible register command.
module Hledger.Cli.Commands.Register
registermode :: Mode RawOpts

-- | Print a (posting) register report.
register :: CliOpts -> Journal -> IO ()

-- | Render a register report as plain text suitable for console output.
postingsReportAsText :: CliOpts -> PostingsReport -> String

-- | Render one register report line item as plain text. Layout is like so:
--    width (specified, terminal width, or 80)
--   -------------------- date (10) description account amount (12)
--   balance (12) DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaa
--   AAAAAAAAAAAA AAAAAAAAAAAA  If description's width is specified,
--   account will use the remaining space. Otherwise, description and
--   account divide up the space equally.
--   
--   With a report interval, the layout is like so:  width
--   (specified, terminal width, or 80) -------------------- date (21)
--   account amount (12) balance (12) DDDDDDDDDDDDDDDDDDDDD
--   aaaaaaaaaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAAA AAAAAAAAAAAA 
--   
--   date and description are shown for the first posting of a transaction
--   only.
--   
--   Returns a string which can be multi-line, eg if the running balance
--   has multiple commodities. Does not yet support formatting control like
--   balance reports.
postingsReportItemAsText :: CliOpts -> Int -> Int -> PostingsReportItem -> String
tests_Register :: Test ()

module Hledger.Cli.Commands.Registermatch
registermatchmode :: Mode RawOpts
registermatch :: CliOpts -> Journal -> IO ()

module Hledger.Cli.Commands.Prices
pricesmode :: Mode RawOpts
prices :: CliOpts -> Journal -> IO ()

-- | The help command.
--   
--   |
module Hledger.Cli.Commands.Help
helpmode :: Mode RawOpts

-- | List or display one of the hledger manuals in various formats. You can
--   select a docs viewer with one of the `--info`, `--man`, `--pager`,
--   `--cat` flags. Otherwise it will use the first available of: info,
--   man, $PAGER, less, stdout (and always stdout if output is
--   non-interactive).
help' :: CliOpts -> Journal -> IO ()

-- | The files command lists included files.
module Hledger.Cli.Commands.Files

-- | Command line options for this command.
filesmode :: Mode RawOpts

-- | The files command.
files :: CliOpts -> Journal -> IO ()

module Hledger.Cli.Commands.Close
closemode :: Mode RawOpts
close :: CliOpts -> Journal -> IO ()

module Hledger.Cli.Commands.Checkdupes
checkdupesmode :: Mode RawOpts
checkdupes :: () => p -> Journal -> IO ()

module Hledger.Cli.Commands.Checkdates
checkdatesmode :: Mode RawOpts
checkdates :: CliOpts -> Journal -> IO ()

-- | A ledger-compatible balance command, with additional support
--   for multi-column reports.
--   
--   Here is a description/specification for the balance command. See also
--   Hledger.Reports -> "Balance reports".
--   
--   Basic balance report
--   
--   With no report interval (--monthly etc.), hledger's balance
--   command emulates ledger's, showing accounts indented according to
--   hierarchy, along with their total amount posted (including
--   subaccounts).
--   
--   Here's an example. With examples/sample.journal, which
--   defines the following account tree:
--   
--   
--   assets
--     bank
--       checking
--       saving
--     cash
--   expenses
--     food
--     supplies
--   income
--     gifts
--     salary
--   liabilities
--     debts
--   
--   
--   the basic balance command gives this output:
--   
--   
--    $ hledger -f sample.journal balance
--                    $-1  assets
--                     $1    bank:saving
--                    $-2    cash
--                     $2  expenses
--                     $1    food
--                     $1    supplies
--                    $-2  income
--                    $-1    gifts
--                    $-1    salary
--                     $1  liabilities:debts
--   --------------------
--                      0
--   
--   
--   Subaccounts are displayed indented below their parent. Only the
--   account leaf name (the final part) is shown. (With --flat,
--   account names are shown in full and unindented.)
--   
--   Each account's "balance" is the sum of postings in that account and
--   any subaccounts during the report period. When the report period
--   includes all transactions, this is equivalent to the account's current
--   balance.
--   
--   The overall total of the highest-level displayed accounts is shown
--   below the line. (The --no-total/-N flag prevents this.)
--   
--   Eliding and omitting
--   
--   Accounts which have a zero balance, and no non-zero subaccount
--   balances, are normally omitted from the report. (The
--   --empty/-E flag forces such accounts to be displayed.) Eg,
--   above checking is omitted because it has a zero balance and
--   no subaccounts.
--   
--   Accounts which have a single subaccount also being displayed, with the
--   same balance, are normally elided into the subaccount's line. (The
--   --no-elide flag prevents this.) Eg, above bank is
--   elided to bank:saving because it has only a single displayed
--   subaccount (saving) and their balance is the same ($1).
--   Similarly, liabilities is elided to
--   liabilities:debts.
--   
--   Date limiting
--   
--   The default report period is that of the whole journal, including all
--   known transactions. The --begin/-b, --end/-e,
--   --period/-p options or date:/date2:
--   patterns can be used to report only on transactions before and/or
--   after specified dates.
--   
--   Depth limiting
--   
--   The --depth option can be used to limit the depth of the
--   balance report. Eg, to see just the top level accounts (still
--   including their subaccount balances):
--   
--   
--   $ hledger -f sample.journal balance --depth 1
--                    $-1  assets
--                     $2  expenses
--                    $-2  income
--                     $1  liabilities
--   --------------------
--                      0
--   
--   
--   Account limiting
--   
--   With one or more account pattern arguments, the report is restricted
--   to accounts whose name matches one of the patterns, plus their parents
--   and subaccounts. Eg, adding the pattern o to the first
--   example gives:
--   
--   
--    $ hledger -f sample.journal balance o
--                     $1  expenses:food
--                    $-2  income
--                    $-1    gifts
--                    $-1    salary
--   --------------------
--                    $-1
--   
--   
--   
--   
- The o pattern matched food and income,
--   so they are shown.
--   
- food's parent (expenses) is shown even though
--   the pattern didn't match it, to clarify the hierarchy. The usual
--   eliding rules cause it to be elided here.
--   
- income's subaccounts are also shown.
--   
--   
--   Multi-column balance report
--   
--   hledger's balance command will show multiple columns when a reporting
--   interval is specified (eg with --monthly), one column for
--   each sub-period.
--   
--   There are three kinds of multi-column balance report, indicated by the
--   heading:
--   
--   
--   
- A "period balance" (or "flow") report (the default) shows the
--   change of account balance in each period, which is equivalent to the
--   sum of postings in each period. Here, checking's balance increased by
--   10 in Feb:
--   
--   
--   
--   Change of balance (flow):
--   
--                    Jan   Feb   Mar
--   assets:checking   20    10    -5
--   
--   
--   
--   
- A "cumulative balance" report (with --cumulative) shows
--   the accumulated ending balance across periods, starting from zero at
--   the report's start date. Here, 30 is the sum of checking postings
--   during Jan and Feb:
--   
--   
--   
--   Ending balance (cumulative):
--   
--                    Jan   Feb   Mar
--   assets:checking   20    30    25
--   
--   
--   
--   
- A "historical balance" report (with --historical/-H) also
--   shows ending balances, but it includes the starting balance from any
--   postings before the report start date. Here, 130 is the balance from
--   all checking postings at the end of Feb, including pre-Jan postings
--   which created a starting balance of 100:
--   
--   
--   
--   Ending balance (historical):
--   
--                    Jan   Feb   Mar
--   assets:checking  120   130   125
--   
--   
--   Eliding and omitting, 2
--   
--   Here's a (imperfect?) specification for the eliding/omitting
--   behaviour:
--   
--   
--   
- Each account is normally displayed on its own line.
--   
- An account less deep than the report's max depth, with just one
--   interesting subaccount, and the same balance as the subaccount, is
--   non-interesting, and prefixed to the subaccount's line, unless
--   --no-elide is in effect.
--   
- An account with a zero inclusive balance and less than two
--   interesting subaccounts is not displayed at all, unless
--   --empty is in effect.
--   
- Multi-column balance reports show full account names with no
--   eliding (like --flat). Accounts (and periods) are omitted as
--   described below.
--   
--   
--   Which accounts to show in balance reports
--   
--   By default:
--   
--   
--   
- single-column: accounts with non-zero balance in report period.
--   (With --flat: accounts with non-zero balance and
--   postings.)
--   
- periodic: accounts with postings and non-zero period balance in
--   any period
--   
- cumulative: accounts with non-zero cumulative balance in any
--   period
--   
- historical: accounts with non-zero historical balance in any
--   period
--   
--   
--   With -E/--empty:
--   
--   
--   
- single-column: accounts with postings in report period
--   
- periodic: accounts with postings in report period
--   
- cumulative: accounts with postings in report period
--   
- historical: accounts with non-zero starting balance + accounts
--   with postings in report period
--   
--   
--   Which periods (columns) to show in balance reports
--   
--   An empty period/column is one where no report account has any
--   postings. A zero period/column is one where no report account has a
--   non-zero period balance.
--   
--   Currently,
--   
--   by default:
--   
--   
--   
- single-column: N/A
--   
- periodic: all periods within the overall report period, except for
--   leading and trailing empty periods
--   
- cumulative: all periods within the overall report period, except
--   for leading and trailing empty periods
--   
- historical: all periods within the overall report period, except
--   for leading and trailing empty periods
--   
--   
--   With -E/--empty:
--   
--   
--   
- single-column: N/A
--   
- periodic: all periods within the overall report period
--   
- cumulative: all periods within the overall report period
--   
- historical: all periods within the overall report period
--   
--   
--   What to show in empty cells
--   
--   An empty periodic balance report cell is one which has no
--   corresponding postings. An empty cumulative/historical balance report
--   cell is one which has no correponding or prior postings, ie the
--   account doesn't exist yet. Currently, empty cells show 0.
module Hledger.Cli.Commands.Balance

-- | Command line options for this command.
balancemode :: Mode RawOpts

-- | The balance command, prints a balance report.
balance :: CliOpts -> Journal -> IO ()

-- | Render a single-column balance report as plain text.
balanceReportAsText :: ReportOpts -> BalanceReport -> String

-- | Render one balance report line item as plain text suitable for console
--   output (or whatever string format is specified). Note, prices will not
--   be rendered, and differently-priced quantities of the same commodity
--   will appear merged. The output will be one or more lines depending on
--   the format and number of commodities.
balanceReportItemAsText :: ReportOpts -> StringFormat -> BalanceReportItem -> [String]

-- | Render a multi-column balance report as plain text suitable for
--   console output.
multiBalanceReportAsText :: ReportOpts -> MultiBalanceReport -> String

-- | Render a multi-column balance report as CSV. The CSV will always
--   include the initial headings row, and will include the final totals
--   row unless --no-total is set.
multiBalanceReportAsCsv :: ReportOpts -> MultiBalanceReport -> CSV

-- | Render a multi-column balance report as HTML.
multiBalanceReportAsHtml :: ReportOpts -> MultiBalanceReport -> Html ()

-- | Render the HTML table rows for a MultiBalanceReport. Returns the
--   heading row, 0 or more body rows, and the totals row if enabled.
multiBalanceReportHtmlRows :: ReportOpts -> MultiBalanceReport -> (Html (), [Html ()], Maybe (Html ()))

-- | Build a Table from a multi-column balance report.
balanceReportAsTable :: ReportOpts -> MultiBalanceReport -> Table String String MixedAmount

-- | Given a table representing a multi-column balance report (for example,
--   made using balanceReportAsTable), render it in a format
--   suitable for console output.
balanceReportTableAsText :: ReportOpts -> Table String String MixedAmount -> String
tests_Balance :: Test ()

-- | Common helpers for making multi-section balance report commands like
--   balancesheet, cashflow, and incomestatement.
module Hledger.Cli.CompoundBalanceCommand

-- | Description of a compound balance report command, from which we
--   generate the command's cmdargs mode and IO action. A compound balance
--   report command shows one or more sections/subreports, each with its
--   own title and subtotals row, in a certain order, plus a grand totals
--   row if there's more than one section. Examples are the balancesheet,
--   cashflow and incomestatement commands.
--   
--   Compound balance reports do sign normalisation: they show all account
--   balances as normally positive, unlike the ordinary BalanceReport and
--   most hledger commands which show incomeliabilityequity balances
--   as normally negative. Each subreport specifies the normal sign of its
--   amounts, and whether it should be added to or subtracted from the
--   grand total.
data CompoundBalanceCommandSpec
CompoundBalanceCommandSpec :: String -> [String] -> String -> String -> [CBCSubreportSpec] -> BalanceType -> CompoundBalanceCommandSpec

-- | command name
[cbcname] :: CompoundBalanceCommandSpec -> String

-- | command aliases
[cbcaliases] :: CompoundBalanceCommandSpec -> [String]

-- | command line help
[cbchelp] :: CompoundBalanceCommandSpec -> String

-- | overall report title
[cbctitle] :: CompoundBalanceCommandSpec -> String

-- | subreport details
[cbcqueries] :: CompoundBalanceCommandSpec -> [CBCSubreportSpec]

-- | the "balance" type (change, cumulative, historical) this report shows
--   (overrides command line flags)
[cbctype] :: CompoundBalanceCommandSpec -> BalanceType

-- | Description of one subreport within a compound balance report.
data CBCSubreportSpec
CBCSubreportSpec :: String -> (Journal -> Query) -> NormalSign -> Bool -> CBCSubreportSpec
[cbcsubreporttitle] :: CBCSubreportSpec -> String
[cbcsubreportquery] :: CBCSubreportSpec -> Journal -> Query
[cbcsubreportnormalsign] :: CBCSubreportSpec -> NormalSign
[cbcsubreportincreasestotal] :: CBCSubreportSpec -> Bool

-- | Generate a cmdargs option-parsing mode from a compound balance command
--   specification.
compoundBalanceCommandMode :: CompoundBalanceCommandSpec -> Mode RawOpts

-- | Generate a runnable command from a compound balance command
--   specification.
compoundBalanceCommand :: CompoundBalanceCommandSpec -> CliOpts -> Journal -> IO ()

-- | The incomestatement command prints a simple income statement
--   (profit & loss report).
module Hledger.Cli.Commands.Incomestatement
incomestatementmode :: Mode RawOpts
incomestatement :: CliOpts -> Journal -> IO ()

-- | The cashflow command prints a simplified cashflow statement.
--   It just shows the change in all "cash" accounts for the period
--   (without the traditional segmentation into operating, investing, and
--   financing cash flows.)
module Hledger.Cli.Commands.Cashflow
cashflowmode :: Mode RawOpts
cashflow :: CliOpts -> Journal -> IO ()

-- | The balancesheetequity command prints a simple balance sheet.
module Hledger.Cli.Commands.Balancesheetequity
balancesheetequitymode :: Mode RawOpts
balancesheetequity :: CliOpts -> Journal -> IO ()

-- | The balancesheet command prints a simple balance sheet.
module Hledger.Cli.Commands.Balancesheet
balancesheetmode :: Mode RawOpts
balancesheet :: CliOpts -> Journal -> IO ()

-- | A history-aware add command to help with data entry. |
module Hledger.Cli.Commands.Add
addmode :: Mode RawOpts

-- | Read multiple transactions from the console, prompting for each field,
--   and append them to the journal file. If the journal came from stdin,
--   this command has no effect.
add :: CliOpts -> Journal -> IO ()

-- | Append a string, typically one or more transactions, to a journal
--   file, or if the file is "-", dump it to stdout. Tries to avoid excess
--   whitespace.
appendToJournalFileOrStdout :: FilePath -> String -> IO ()

-- | Append this transaction to the journal's file and transaction list.
journalAddTransaction :: Journal -> CliOpts -> Transaction -> IO Journal

-- | Find the most similar and recent transactions matching the given
--   transaction description and report query. Transactions are listed with
--   their "relevancy" score, most relevant first.
transactionsSimilarTo :: Journal -> Query -> Text -> [(Double, Transaction)]
instance GHC.Show.Show Hledger.Cli.Commands.Add.RestartTransactionException
instance GHC.Show.Show Hledger.Cli.Commands.Add.EntryState
instance GHC.Exception.Type.Exception Hledger.Cli.Commands.Add.RestartTransactionException

-- | A ledger-compatible print command.
module Hledger.Cli.Commands.Print
printmode :: Mode RawOpts

-- | Print journal transactions in standard format.
print' :: CliOpts -> Journal -> IO ()
originalTransaction :: Transaction -> Transaction

module Hledger.Cli.Commands.Rewrite
rewritemode :: Mode RawOpts
rewrite :: CliOpts -> Journal -> IO ()
instance Data.Traversable.Traversable Hledger.Cli.Commands.Rewrite.DiffLine
instance Data.Foldable.Foldable Hledger.Cli.Commands.Rewrite.DiffLine
instance GHC.Base.Functor Hledger.Cli.Commands.Rewrite.DiffLine
instance GHC.Show.Show a => GHC.Show.Show (Hledger.Cli.Commands.Rewrite.DiffLine a)

module Hledger.Cli.Commands.Printunique
printuniquemode :: Mode RawOpts
printunique :: CliOpts -> Journal -> IO ()

module Hledger.Cli.Commands.Import
importmode :: Mode RawOpts
importcmd :: CliOpts -> Journal -> IO ()

-- | Print a bar chart of posting activity per day, or other report
--   interval.
module Hledger.Cli.Commands.Activity
activitymode :: Mode RawOpts
barchar :: Char

-- | Print a bar chart of number of postings per report interval.
activity :: CliOpts -> Journal -> IO ()
showHistogram :: ReportOpts -> Query -> Journal -> String
printDayWith :: (PrintfArg t1, PrintfType t2) => (t3 -> t1) -> (DateSpan, t3) -> t2
countBar :: Foldable t => t a -> [Char]

-- | The accounts command lists account names:
--   
--   
--   
- in flat mode (default), it lists the full names of accounts posted
--   to by matched postings, clipped to the specified depth, possibly with
--   leading components dropped.
--   
- in tree mode, it shows the indented short names of accounts posted
--   to by matched postings, and their parents, to the specified
--   depth.
--   
module Hledger.Cli.Commands.Accounts

-- | Command line options for this command.
accountsmode :: Mode RawOpts

-- | The accounts command.
accounts :: CliOpts -> Journal -> IO ()

-- | hledger's built-in commands, and helpers for printing the commands
--   list.
module Hledger.Cli.Commands

-- | Look up a builtin command's mode and action by exact command name or
--   alias.
findCommand :: String -> Maybe (Mode RawOpts, CliOpts -> Journal -> IO ())

-- | See testmode.
--   
--   Unlike other hledger commands, this one does not operate on the user's
--   Journal. For ease of implementation the Journal parameter remains in
--   the type signature.
testcmd :: CliOpts -> Journal -> IO ()

-- | The cmdargs subcommand mode and IO action for each builtin command.
--   Command actions take parsed CLI options and a (lazy) finalised
--   journal.
builtinCommands :: [(Mode RawOpts, CliOpts -> Journal -> IO ())]

-- | All names and aliases of builtin commands.
builtinCommandNames :: [String]

-- | Print the commands list, modifying the template above based on the
--   currently available addons. Missing addons will be removed, and extra
--   addons will be added under Misc.
printCommandsList :: [String] -> IO ()
tests_Commands :: Test ()

-- | Hledger.Cli re-exports the options, utilities and commands provided by
--   the hledger command-line program. This module also aggregates the
--   built-in unit tests defined throughout hledger and hledger-lib, and
--   adds some more which are easier to define here.
module Hledger.Cli
tests_Cli :: Test ()

-- | Create verbosity flags triggered by -v/--verbose and
--   -q/--quiet
flagsVerbosity :: () => (Verbosity -> a -> a) -> [Flag a]

-- | Create a version flag triggered by --numeric-version.
flagNumericVersion :: () => (a -> a) -> Flag a

-- | Create a version flag triggered by -V/--version.
flagVersion :: () => (a -> a) -> Flag a

-- | Create a help flag triggered by -?/--help. The user
--   may optionally modify help by specifying the format, such as:
--   
--   
--   --help=all          - help for all modes
--   --help=html         - help in HTML format
--   --help=100          - wrap the text at 100 characters
--   --help=100,one      - full text wrapped at 100 characters
--   
flagHelpFormat :: () => (HelpFormat -> TextFormat -> a -> a) -> Flag a

-- | Create a help flag triggered by -?/--help.
flagHelpSimple :: () => (a -> a) -> Flag a

-- | Like processValue but on failure prints to stderr and exits the
--   program.
processValueIO :: () => Mode a -> [String] -> IO a

-- | Process a list of flags (usually obtained from getArgs
--   and expandArgsAt) with a mode. Throws an error if the
--   command line fails to parse, or returns the associated value.
--   Implemeneted in terms of process. This function does not take
--   account of any environment variables that may be set (see
--   processArgs).
--   
--   If you are in IO you will probably get a better user experience
--   by calling processValueIO.
processValue :: () => Mode a -> [String] -> a

-- | Process the flags obtained by getArgs and
--   expandArgsAt with a mode. Displays an error and exits
--   with failure if the command line fails to parse, or returns the
--   associated value. Implemented in terms of process. This
--   function makes use of the following environment variables:
--   
--   
--   
- $CMDARGS_COMPLETE - causes the program to produce
--   completions using complete, then exit. Completions are based on
--   the result of getArgs, the index of the current argument is
--   taken from $CMDARGS_COMPLETE (set it to - to
--   complete the last argument), and the index within that argument is
--   taken from $CMDARGS_COMPLETE_POS (if set).
--   
- $CMDARGS_HELPER/$CMDARGS_HELPER_PROG -
--   uses the helper mechanism for entering command line programs as
--   described in System.Console.CmdArgs.Helper.
--   
processArgs :: () => Mode a -> IO a

-- | Generate a help message from a mode. The first argument is a prefix,
--   which is prepended when not using HelpFormatBash or
--   HelpFormatZsh.
helpText :: () => [String] -> HelpFormat -> Mode a -> [Text]

-- | Specify the format to output the help.
data HelpFormat

-- | Equivalent to HelpFormatAll if there is not too much text,
--   otherwise HelpFormatOne.
HelpFormatDefault :: HelpFormat

-- | Display only the first mode.
HelpFormatOne :: HelpFormat

-- | Display all modes.
HelpFormatAll :: HelpFormat

-- | Bash completion information
HelpFormatBash :: HelpFormat

-- | Z shell completion information
HelpFormatZsh :: HelpFormat

-- | Given a current state, return the set of commands you could type now,
--   in preference order.
complete :: () => Mode a -> [String] -> (Int, Int) -> [Complete]

-- | How to complete a command line option. The Show instance is
--   suitable for parsing from shell scripts.
data Complete

-- | Complete to a particular value
CompleteValue :: String -> Complete

-- | Complete to a prefix, and a file
CompleteFile :: String -> FilePath -> Complete

-- | Complete to a prefix, and a directory
CompleteDir :: String -> FilePath -> Complete

-- | Process a list of flags (usually obtained from
--   getArgs/expandArgsAt) with a mode. Returns
--   Left and an error message if the command line fails to parse,
--   or Right and the associated value.
process :: () => Mode a -> [String] -> Either String a

-- | Create a boolean flag, with a list of flag names, an update function
--   and some help text.
flagBool :: () => [Name] -> (Bool -> a -> a) -> Help -> Flag a

-- | Create an argument flag, with an update function and the type of the
--   argument.
flagArg :: () => Update a -> FlagHelp -> Arg a

-- | Create a flag taking a required argument value, with a list of flag
--   names, an update function, the type of the argument and some help
--   text.
flagReq :: () => [Name] -> Update a -> FlagHelp -> Help -> Flag a

-- | Create a flag taking an optional argument value, with an optional
--   value, a list of flag names, an update function, the type of the
--   argument and some help text.
flagOpt :: () => String -> [Name] -> Update a -> FlagHelp -> Help -> Flag a

-- | Create a flag taking no argument value, with a list of flag names, an
--   update function and some help text.
flagNone :: () => [Name] -> (a -> a) -> Help -> Flag a

-- | Create a list of modes, with a program name, an initial value, some
--   help text and the child modes.
modes :: () => String -> a -> Help -> [Mode a] -> Mode a

-- | Create a mode with a name, an initial value, some help text, a way of
--   processing arguments and a list of flags.
mode :: () => Name -> a -> Help -> Arg a -> [Flag a] -> Mode a

-- | Create an empty mode specifying only modeValue. All other
--   fields will usually be populated using record updates.
modeEmpty :: () => a -> Mode a

-- | Version of remap for the Update type alias.
remapUpdate :: () => (a -> b) -> (b -> (a, a -> b)) -> Update a -> Update b

-- | Restricted version of remap where the values are isomorphic.
remap2 :: Remap m => (a -> b) -> (b -> a) -> m a -> m b

-- | Check that a mode is well formed.
checkMode :: () => Mode a -> Maybe String

-- | Extract the value from inside a FlagOpt or FlagOptRare,
--   or raises an error.
fromFlagOpt :: FlagInfo -> String

-- | Extract the flags from a Mode
modeFlags :: () => Mode a -> [Flag a]

-- | Extract the modes from a Mode
modeModes :: () => Mode a -> [Mode a]

-- | Convert a list into a group, placing all fields in
--   groupUnnamed.
toGroup :: () => [a] -> Group a

-- | Convert a group into a list.
fromGroup :: () => Group a -> [a]

-- | Parse a boolean, accepts as True: true yes on enabled 1.
parseBool :: String -> Maybe Bool

-- | A help message that goes with either a flag or a mode.
type Help = String

-- | The type of a flag, i.e. --foo=TYPE.
type FlagHelp = String

-- | A group of items (modes or flags). The items are treated as a list,
--   but the group structure is used when displaying the help message.
data Group a
Group :: [a] -> [a] -> [(Help, [a])] -> Group a

-- | Normal items.
[groupUnnamed] :: Group a -> [a]

-- | Items that are hidden (not displayed in the help message).
[groupHidden] :: Group a -> [a]

-- | Items that have been grouped, along with a description of each group.
[groupNamed] :: Group a -> [(Help, [a])]

-- | A mode. Do not use the Mode constructor directly, instead use
--   mode to construct the Mode and then record updates. Each
--   mode has three main features:
--   
--   
--   
- A list of submodes (modeGroupModes)
--   
- A list of flags (modeGroupFlags)
--   
- Optionally an unnamed argument (modeArgs)
--   
--   
--   To produce the help information for a mode, either use
--   helpText or show.
data Mode a
Mode :: Group (Mode a) -> [Name] -> a -> (a -> Either String a) -> (a -> Maybe [String]) -> Bool -> Help -> [String] -> ([Arg a], Maybe (Arg a)) -> Group (Flag a) -> Mode a

-- | The available sub-modes
[modeGroupModes] :: Mode a -> Group (Mode a)

-- | The names assigned to this mode (for the root mode, this name is used
--   as the program name)
[modeNames] :: Mode a -> [Name]

-- | Value to start with
[modeValue] :: Mode a -> a

-- | Check the value reprsented by a mode is correct, after applying all
--   flags
[modeCheck] :: Mode a -> a -> Either String a

-- | Given a value, try to generate the input arguments.
[modeReform] :: Mode a -> a -> Maybe [String]

-- | Expand @ arguments with expandArgsAt, defaults to
--   True, only applied if using an IO processing function.
--   Only the root Modes value will be used.
[modeExpandAt] :: Mode a -> Bool

-- | Help text
[modeHelp] :: Mode a -> Help

-- | A longer help suffix displayed after a mode
[modeHelpSuffix] :: Mode a -> [String]

-- | The unnamed arguments, a series of arguments, followed optionally by
--   one for all remaining slots
[modeArgs] :: Mode a -> ([Arg a], Maybe (Arg a))

-- | Groups of flags
[modeGroupFlags] :: Mode a -> Group (Flag a)

-- | The FlagInfo type has the following meaning:
--   
--   
--                FlagReq     FlagOpt      FlagOptRare/FlagNone
--   -xfoo        -x=foo      -x=foo       -x -foo
--   -x foo       -x=foo      -x foo       -x foo
--   -x=foo       -x=foo      -x=foo       -x=foo
--   --xx foo     --xx=foo    --xx foo     --xx foo
--   --xx=foo     --xx=foo    --xx=foo     --xx=foo
--   
data FlagInfo

-- | Required argument
FlagReq :: FlagInfo

-- | Optional argument
FlagOpt :: String -> FlagInfo

-- | Optional argument that requires an = before the value
FlagOptRare :: String -> FlagInfo

-- | No argument
FlagNone :: FlagInfo

-- | A function to take a string, and a value, and either produce an error
--   message (Left), or a modified value (Right).
type Update a = String -> a -> Either String a

-- | A flag, consisting of a list of flag names and other information.
data Flag a
Flag :: [Name] -> FlagInfo -> Update a -> FlagHelp -> Help -> Flag a

-- | The names for the flag.
[flagNames] :: Flag a -> [Name]

-- | Information about a flag's arguments.
[flagInfo] :: Flag a -> FlagInfo

-- | The way of processing a flag.
[flagValue] :: Flag a -> Update a

-- | The type of data for the flag argument, i.e. FILE/DIR/EXT
[flagType] :: Flag a -> FlagHelp

-- | The help message associated with this flag.
[flagHelp] :: Flag a -> Help

-- | An unnamed argument. Anything not starting with - is
--   considered an argument, apart from "-" which is considered to
--   be the argument "-", and any arguments following
--   "--". For example:
--   
--   
--   programname arg1 -j - --foo arg3 -- -arg4 --arg5=1 arg6
--   
--   
--   Would have the arguments:
--   
--   
--   ["arg1","-","arg3","-arg4","--arg5=1","arg6"]
--   
data Arg a
Arg :: Update a -> FlagHelp -> Bool -> Arg a

-- | A way of processing the argument.
[argValue] :: Arg a -> Update a

-- | The type of data for the argument, i.e. FILE/DIR/EXT
[argType] :: Arg a -> FlagHelp

-- | Is at least one of these arguments required, the command line will
--   fail if none are set
[argRequire] :: Arg a -> Bool

-- | Like functor, but where the the argument isn't just covariant.
class Remap (m :: Type -> Type)

-- | Convert between two values.
remap :: Remap m => (a -> b) -> (b -> (a, a -> b)) -> m a -> m b

-- | Given a string, split into the available arguments. The inverse of
--   joinArgs.
splitArgs :: String -> [String]

-- | Given a sequence of arguments, join them together in a manner that
--   could be used on the command line, giving preference to the Windows
--   cmd shell quoting conventions.
--   
--   For an alternative version, intended for actual running the result in
--   a shell, see "System.Process.showCommandForUser"
joinArgs :: [String] -> String

-- | Expand @ directives in a list of arguments, usually obtained
--   from getArgs. As an example, given the file test.txt
--   with the lines hello and world:
--   
--   
--   expandArgsAt ["@test.txt","!"] == ["hello","world","!"]
--   
--   
--   Any @ directives in the files will be recursively expanded
--   (raising an error if there is infinite recursion).
--   
--   To supress @ expansion, pass any @ arguments after
--   --.
expandArgsAt :: [String] -> IO [String]

-- | hledger - a ledger-compatible accounting tool. Copyright (c) 2007-2011
--   Simon Michael simon@joyful.com Released under GPL version 3 or
--   later.
--   
--   hledger is a partial haskell clone of John Wiegley's "ledger". It
--   generates ledger-compatible register & balance reports from a
--   plain text journal, and demonstrates a functional implementation of
--   ledger. For more information, see http://hledger.org .
--   
--   This module provides the main function for the hledger command-line
--   executable. It is exposed here so that it can be imported by eg
--   benchmark scripts.
--   
--   You can use the command line:
--   
--   
--   $ hledger --help
--   
--   
--   or ghci:
--   
--   
--   $ ghci hledger
--   > j <- readJournalFile def "examples/sample.journal"
--   > register [] ["income","expenses"] j
--   2008/01/01 income               income:salary                   $-1          $-1
--   2008/06/01 gift                 income:gifts                    $-1          $-2
--   2008/06/03 eat & shop           expenses:food                    $1          $-1
--                                   expenses:supplies                $1            0
--   > balance [Depth "1"] [] l
--                    $-1  assets
--                     $2  expenses
--                    $-2  income
--                     $1  liabilities
--   > l <- myLedger
--   
--   
--   See Hledger.Data.Ledger for more examples.
module Hledger.Cli.Main

-- | The overall cmdargs mode describing hledger's command-line options and
--   subcommands.
mainmode :: [Name] -> Mode RawOpts

-- | Let's go!
main :: IO ()

-- | Parse hledger CLI options from these command line arguments and add-on
--   command names, or raise any error.
argsToCliOpts :: [String] -> [String] -> IO CliOpts

-- | A hacky workaround for cmdargs not accepting flags before the
--   subcommand name: try to detect and move such flags after the command.
--   This allows the user to put them in either position. The order of
--   options is not preserved, but this should be ok.
--   
--   Since we're not parsing flags as precisely as cmdargs here, this is
--   imperfect. We make a decent effort to: - move all no-argument
--   helpinputreport flags - move all required-argument
--   helpinputreport flags along with their values, space-separated
--   or not - not confuse things further or cause misleading errors.
moveFlagsAfterCommand :: [String] -> [String]
isMovableNoArgFlag :: [Char] -> Bool
isMovableReqArgFlag :: [Char] -> Bool
isMovableReqArgFlagAndValue :: [Char] -> Bool
isValue :: [Char] -> Bool
flagstomove :: [Flag RawOpts]
noargflagstomove :: [Name]
reqargflagstomove :: [Name]
