rE      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                       *\Join multi-line strings as side-by-side rectangular strings of the same height, top-padded. _Join multi-line strings as side-by-side rectangular strings of the same height, bottom-padded. .Compose strings vertically and right-aligned. XConvert a multi-line string to a rectangular string top-padded to the specified height. [Convert a multi-line string to a rectangular string bottom-padded to the specified height. XConvert a multi-line string to a rectangular string left-padded to the specified width. YConvert a multi-line string to a rectangular string right-padded to the specified width. NClip a multi-line string to the specified width and height from the top left. IClip and pad a multi-line string to fill the specified width and height. #List just the leaf nodes of a tree Iget the sub-tree rooted at the first (left-most, depth-first) occurrence  of the specified node value Cget the sub-tree for the specified node value in the first tree in  forest in which it occurs. &remove all nodes past a certain depth apply f to all tree nodes 9remove all subtrees whose nodes do not fulfill predicate (is predicate true in any node of tree ? .show a compact ascii representation of a tree 0show a compact ascii representation of a forest 9trace (print on stdout at runtime) a showable expression < (for easily tracing in the middle of a complex expression) Clabelled trace - like strace, with a newline and a label prepended 1trace an expression using a custom show function   Get a Test's label, or the empty string. !AFlatten a Test containing TestLists into a list of single tests. "CFilter TestLists in a Test, recursively, preserving the structure. #FSimple way to assert something is some expected value, with no label. $JAssert a parse result is successful, printing the parse error on failure. %SAssert a parse result is some expected value, printing the parse error on failure. &'()      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'() *+,-./0 !"#$%&'()*  !"#$%&'()*  !"#$%&'()m*;A generic, pure specification of how to filter transactions/ postings. F This exists to keep app-specific options out of the hledger library. +,"only include if in this date span -only include if cleared/ uncleared/don't care .only include if real/don't care /%include if empty (ie amount is zero) 0"convert all amounts to cost basis 10only include if matching these account patterns 24only include if matching these description patterns 3)which dates to use (actual or effective) 456789:;<=transactions in this account >4sum of transactions in this account and subaccounts ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs this posting'+s parent transaction (co-recursive types). 4 Tying this knot gets tedious, Maybe makes it easier/ optional. tuvwxyz{|}~ unit price/0conversion rate for this amount at posting time  the commodity' s symbol 3 display preferences for amounts of this commodity 2should the symbol appear on the left or the right 4should there be a space between symbol and quantity $should thousands be comma-separated $number of decimal places to display m*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mz{|}~xytwvulmnopqrsbcdefghijk^_`aZ[\]TYXWVUOPQRSJKLMN?@ABCDEFGHI:;<=>56789*+,-./01234m* +,-./01234+,-./01234567896789:;<=>;<=>? @ABCDEFGHI@ABCDEFGHIJKLMNKLMNOPQRSPQRSTYXWVUUVWXYZ[\][\]^_`a_`ab cdefghijkcdefghijklmnopqrsmnopqrstwvuuvwxyyz{|}~{|}~,OSplit a DateSpan into one or more consecutive spans at the specified interval. ECount the days in a DateSpan, or if it is open-ended return Nothing. DParse a period expression to an Interval and overall DateSpan using 1 the provided reference date, or raise an error. EConvert a single smart date string to a date span using the provided $ reference date, or raise an error. /Convert a smart date string to an explicit yyyy/mm/dd string using 1 the provided reference date, or raise an error. #A safe version of fixSmartDateStr. KConvert a SmartDate to an absolute date using the provided reference date. ;Parse a couple of date-time string formats to a time type. 6Parse a couple of date string formats to a time type. <Parse a date-time string to a time type, or raise an error. 7Parse a date string to a time type, or raise an error. BParse a time string to a time type using the provided pattern, or  return the default. 4Parse a date in any of the formats allowed in ledger's period expressions, and maybe some others:   2004  2004/10  2004/10/1  10/1  21  october, oct  yesterday, today, tomorrow 6 (not yet) this/next/last week/day/month/quarter/year NReturns a SmartDate, to be converted to a full date later (see fixSmartDate). :Assumes any text in the parse stream has been lowercased. PLike smartdate, but there must be nothing other than whitespace after the date. I123456789:;<=>?@ABCDEFGHIJKLM,,ELook up one of the hard-coded default commodities. For use in tests. GFind the conversion rate between two commodities. Currently returns 1. NOPQRSTUVWEApply a binary arithmetic operator to two amounts, converting to the  second one':s commodity (and display precision), discarding any price F information. (Using the second commodity is best since sum and other * folds start with a no-commodity amount.) CConvert an amount to the specified commodity using the appropriate . exchange rate (which is currently always 1). 0Convert mixed amount to the specified commodity ?Convert an amount to the commodity of its saved price, if any. BGet the string representation of an amount, based on its commodity's  display settings. GGet the unambiguous string representation of an amount, for debugging. 8Get the string representation of an amount, without any @ price. CGet the string representation (of the number part of) of an amount ;Add thousands-separating commas to a decimal number string MDoes this amount appear to be zero when displayed with its given precision ? Is this amount really- zero, regardless of the display precision ? N Since we are using floating point, for now just test to some high precision. Access a mixed amount's components. 5Does this mixed amount appear to be zero - empty, or : containing only simple amounts which appear to be zero ? Is this mixed amount really zero ? See isReallyZeroAmount. Is this mixed amount really zero, after converting to cost  commodities where possible ? 2MixedAmount derives Eq in Types.hs, but that doesn't know that we  want $0 = EUR0 = 0. Yet we don''t want to drag all this code in there. D When zero equality is important, use this, for now; should be used  everywhere. AGet the string representation of a mixed amount, showing each of D its component amounts. NB a mixed amount can have an empty amounts  list in which case it shows as "". JGet an unambiguous string representation of a mixed amount for debugging. =Get the string representation of a mixed amount, but without  any @ prices. ;Get the string representation of a mixed amount, and if it : appears to be all zero just show a bare 0, ledger-style. >Get the string representation of a mixed amount, or a bare 0,  without any @ prices. FSimplify a mixed amount by combining any component amounts which have C the same commodity and the same price. Also removes zero amounts, > or adds a single zero amount if there are no amounts at all. FSimplify a mixed amount by combining any component amounts which have G the same commodity, ignoring and discarding their unit prices if any. I Also removes zero amounts, or adds a single zero amount if there are no  amounts at all. Convert a mixed amount'.s component amounts to the commodity of their  saved price, if any. The empty simple amount. The empty mixed amount. IA temporary value for parsed transactions which had no amount specified. $XYZ[\ a:b:c,d:e -> [a,a:b,a:b:c,d,d:e]  a:b:c,d:e -> [a,d] <From a list of account names, select those which are direct ( subaccounts of the given account name. +Convert a list of account names to a tree. 5Elide an account name to fit in the specified width.  From the ledger 2.6 news:  H What Ledger now does is that if an account name is too long, it will F start abbreviating the first parts of the account name down to two E letters in length. If this results in a string that is still too @ long, the front will be elided -- not the end. For example:  +Expenses:Cash ; OK, not too long  Ex:Wednesday:Cash ; Expenses was abbreviated to fit  Ex:We:Afternoon:Cash ; Expenses and  Wednesday abbreviated E ; Expenses:Wednesday:Afternoon:Lunch:Snack:Candy:Chocolate:Cash 7 ..:Af:Lu:Sn:Ca:Ch:Cash ; Abbreviated and elided! ]^_`ab 4Does this posting fall within the given date span ? >Get the minimal date span which contains all the postings, or - DateSpan Nothing Nothing if there are none. cde  @Show a ledger entry, formatted for the print command. ledger 2.x's !standard format looks like this:  yyyymmdd[ *][ CODE]: description......... [ ; comment...............] O account name 1..................... ...$amount1[ ; comment...............] O account name 2..................... ..$-amount1[ ; comment...............]  Dpcodewidth = no limit -- 10 -- mimicking ledger layout. 0pdescwidth = no limit -- 20 -- I don't remember what these mean, Lpacctwidth = 35 minimum, no maximum -- they were important at the time. pamtwidth = 11 pcommentwidth = no limit -- 22    =Show an account name, clipped to the given width if any, and  appropriately bracketed/*parenthesised for the given posting type.   Get the sums of a transaction'0s real, virtual, and balanced virtual postings. 5Is this transaction balanced ? A balanced transaction's real D (non-virtual) postings sum to 0, and any balanced virtual postings  also sum to 0. DEnsure that this entry is balanced, possibly auto-filling a missing A amount first. We can auto-fill if there is just one non-virtual @ transaction without an amount. The auto-filled balance will be H converted to cost basis if possible. If the entry can not be balanced, " return an error message instead. AConvert the primary date to either the actual or effective date. Ensure a transaction's postings refer back to it.  Set a posting's parent transaction.      f           BConvert time log entries to ledger transactions. When there is no E clockout, add one with the provided current time. Sessions crossing ? midnight are split into days to give accurate per-day totals. EConvert a timelog clockin and clockout entry to an equivalent ledger M entry, representing the time expenditure. Note this entry is not balanced,  since we omit the " assets:time"! transaction for simpler output.  " !"=Keep only transactions we are interested in, as described by ? the filter specification. May also massage the data a little. #9Keep only postings we are interested in, as described by ? the filter specification. May also massage the data a little. ) This can leave unbalanced transactions. $RKeep only ledger transactions whose description matches the description patterns. %FKeep only ledger transactions which fall between begin and end dates. O We include transactions on the begin date and exclude transactions on the end @ date, like ledger. An empty date string means no restriction. &7Keep only ledger transactions which have the requested  cleared/#uncleared status, if there is one. '3Keep only postings which have the requested cleared/uncleared status,  if there is one. (BStrip out any virtual postings, if the flag is true, otherwise do  no filtering. )BStrip out any postings with zero amount, unless the flag is true. *NKeep only transactions which affect accounts deeper than the specified depth. +CStrip out any postings to accounts deeper than the specified depth C (and any ledger transactions which have no postings as a result). ,NKeep only transactions which affect accounts matched by the account patterns. -JKeep only postings which affect accounts matched by the account patterns. ) This can leave transactions unbalanced. .Convert this journal's transactions' primary date to either the  actual or effective date. /Convert all the journal'/s amounts to their canonical display settings. K Ie, in each commodity, amounts will use the display settings of the first F amount detected, and the greatest precision of the amounts detected. F Also, missing unit prices are added if known from the price history. C Also, amounts are converted to cost basis if that flag is active.  XXX refactor 09Get just the amounts from a ledger, in the order parsed. 1EGet just the ammount commodities from a ledger, in the order parsed. 2CGet just the amount precisions from a ledger, in the order parsed. 3AClose any open timelog sessions using the provided current time. 4=The (fully specified) date span containing all the raw ledger's transactions, 0 or DateSpan Nothing Nothing if there are none. 5 Check if a set of ledger account/!description patterns matches the I given account name or entry description. Patterns are case-insensitive G regular expression strings; those beginning with - are anti-patterns. 6>Calculate the account tree and account balances from a journal's 8 postings, and return the results for efficient lookup. 7FGiven a list of postings, return an account name tree and three query B functions that fetch postings, balance, and subaccount-including > balance by account name. This factors out common logic from . cacheLedger and summarisePostingsInDateSpan. 8EAdd subaccount-excluding and subaccount-including balances to a tree G of account names somewhat efficiently, given a function that looks up  transactions by account name. 9>Convert a list of postings to a map from account name to that  account' s postings. " !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789 ;:"Some context kept during parsing. ;<0the default year most recently specified with Y =I don't know >;the current stack of parent accounts specified by !account ?,A JournalUpdate is some transformation of a Journal . It can do I/O  or raise an error. @ABCDEFG*Parses a ledger file or timelog file to a Journal, or gives an G error. Requires the current (local) time to calculate any unfinished 4 timelog sessions, we pass it in for repeatability. H@Like parseLedgerFile, but parses a string. A file path is still , provided to save in the resulting journal. I7Top-level journal parser. Returns a single composite, I/O performing,  error-raising  JournalUpdate* which can be applied to an empty journal  to get the final result. JKLMNOPQRSTUVWXYZ@Try to parse a ledger entry. If we successfully parse an entry, , check it can be balanced, and fail if not. [\]Match a partial M/4D date in a ledger, and also require that a default , year directive was previously encountered. ^_`abcdefCParse an account name. Account names may have single spaces inside I them, and are terminated by two or more spaces. They should have one or E more components of at least one character, separated by the account  separator char. gDParse an amount, with an optional left or right currency symbol and  optional price. hijklmnoDParse a ledger-style numeric quantity and also return the number of D digits to the right of the decimal point and whether thousands are  separated by comma. pDparse the two strings of digits before and after a possible decimal D point. The integer part may contain commas, or either part may be " empty, or there may be no point. qrsParse a timelog entry. tEParse a hledger display expression, which is a simple date test like  d>[DATE] or  d<=[DATE], and return a Posting-matching predicate. ?:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstghij;?:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst;:;<=>;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstk u3Like cacheLedger, but filtering the journal first. vwFConvert a journal to a more efficient cached ledger, described above. x:Add (or recalculate) the cached journal info in a ledger. y List a ledger's account names. z.Get the named account from a (cached) ledger. : If the ledger has not been cached (with crunchJournal or  cacheLedger'"), this returns the null account. { List a ledger's accounts, in tree order | List a ledger'$s top-level accounts, in tree order }BAccounts in ledger whose name matches the pattern, in tree order. ~List a ledger account's immediate subaccounts  List a ledger'!s postings, in the order parsed.  Get a ledger'+s tree of accounts to the specified depth.  Get a ledger'4s tree of accounts rooted at the specified account. 9The (fully specified) date span containing all the ledger's (filtered) transactions, 0 or DateSpan Nothing Nothing if there are none. Convenience aliases. uvwxlyz{|}~vwxuyz{|}~uvwxyz{|}~  Get the user's default ledger file path.  Get the user's default timelog file path.  Read the user')s default ledger file, or give an error.  Read the user'*s default timelog file, or give an error. CRead a ledger from this file, with no filtering, or give an error. @Read a Journal from the given string, using the current time as ( reference time, or give a parse error. mnopqr      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'() *+,-./0 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde     f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstghijkuvwxlyz{|}~mnopqr !"#$%&'()*+,-./0123456789::;<=>?@ABCDEFGGHIJKKLMNOPQRSTUUVWXYYZ[\]^_`abccdeffghiijklmnopqrrstuvwxyz{|}~               ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                              !"#$%&'()*+,-./0123456768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]^_^`^a^b^cdedfghijklmnopqrstuvwxyz{|}~^^^^^^^^^^^^      !"!#!$!$!%&'&(&)&*&+&,&-&.&/012324252627898:8;8<8=8>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~          hledger-lib-0.9 Ledger.Utils Ledger.Types Ledger.DatesLedger.Commodity Ledger.AmountLedger.AccountNameLedger.PostingLedger.TransactionLedger.TimeLogLedger.Journal Ledger.Parse Ledger.Ledger Ledger.IOLedgerLedger.Account underline unbracketconcatTopPaddedconcatBottomPaddedvConcatRightAlignedpadtop padbottompadleftpadright cliptopleftfitto difforzero containsRegexsplitAtElementleaves subtreeatsubtreeinforest treeprunetreemap treefiltertreeanyshowtree showforeststraceltrace parsewith parseWithCtx fromparsenonspacespacenonewline restoflinegetCurrentLocalTimetnametflattentfilteris assertParseassertParseEqualprintParseErrorisLeftisRightstrictReadFile FilterSpecdatespanclearedrealempty costbasisacctpatsdescpats whichdatedepthjournalaccountnametree accountmapAccountaname apostingsabalanceJournal jmodifiertxns jperiodictxnsjtxnsopen_timelog_entrieshistorical_pricesfinal_comment_linesfilepath filereadtimejtextHistoricalPricehdatehsymbolhamount TimeLogEntrytlcode tldatetime tlcomment TimeLogCodeFinalOutOutInSetRequiredHours SetBalancePeriodicTransactionptperiodicexpr ptpostingsModifierTransaction mtvalueexpr mtpostings Transactiontdateteffectivedatetstatustcode tdescriptiontcomment tpostingstpreceding_comment_linesPostingpstatuspaccountpamountpcommentptype ptransaction PostingTypeBalancedVirtualPostingVirtualPostingRegularPosting MixedAmountMixedAmount commodityquantityprice Commoditysymbolsidespacedcomma precisionSideRL AccountNameIntervalYearly QuarterlyMonthlyWeeklyDaily NoIntervalDateSpan WhichDate EffectiveDate ActualDate SmartDateshowDate getCurrentDayelapsedSeconds splitSpan splitspan daysInSpanparsePeriodExprspanFromSmartDateStringspanFromSmartDateshowDayfixSmartDateStrfixSmartDateStrEither fixSmartDateprevdayparsedatetimeM parsedateM parsedatetime parsedate parsetimewith smartdate smartdateonlyyyyymmddymdymydmdmonthmontoday yesterdaytomorrowlastthisnextthing periodexprintervalanddateperiodexprintervalperiodexprdateperiodexprperiodexprintervalperiodexprdatespandoubledatespan fromdatespan todatespan justdatespan mkdatespancommconversionRateamountopconvertAmountToconvertMixedAmountTo costOfAmount showAmountshowAmountDebugshowAmountWithoutPrice showAmount'punctuatethousands isZeroAmountisReallyZeroAmountamountsisZeroMixedAmountisReallyZeroMixedAmountisReallyZeroMixedAmountCostmixedAmountEqualsshowMixedAmountshowMixedAmountDebugshowMixedAmountWithoutPriceshowMixedAmountOrZero!showMixedAmountOrZeroWithoutPricenormaliseMixedAmount!normaliseMixedAmountIgnoringPrice)sumMixedAmountsPreservingHighestPrecision.normaliseMixedAmountPreservingHighestPrecision$sumAmountsPreservingHighestPrecision"amountopPreservingHighestPrecisioncostOfMixedAmountnullamt nullmixedamt missingamtTree'TaccountNameComponentsaccountNameFromComponentsaccountLeafNameaccountNameLevelexpandAccountNamestopAccountNamesparentAccountNameparentAccountNamesisAccountNamePrefixOfisSubAccountNameOfsubAccountNamesFromaccountNameTreeFrom mergeTreespathtree fromPaths converttreeexpandTreeNamesaccountNameTreeFrom4elideAccountNameclipAccountName showPostingisReal isVirtualisBalancedVirtual hasAmountaccountNamesFromPostings sumPostings postingDatepostingClearedisPostingInDateSpanisEmptyPostingpostingsDateSpannulltransactionshowTransactionshowTransactionUnelidedshowTransactionForPrintshowTransaction'showAccountName realPostingsvirtualPostingsbalancedVirtualPostingstransactionPostingBalancesisTransactionBalancedbalanceTransactionnonzerobalanceerrorledgerTransactionWithDate txnTieKnotsettxnentriesFromTimeLogEntriesentryFromTimeLogInOut nulljournaladdTransactionaddModifierTransactionaddPeriodicTransactionaddHistoricalPriceaddTimeLogEntryjournalPostingsjournalAccountNamesUsedjournalAccountNamesjournalAccountNameTreefilterJournalTransactionsfilterJournalPostings&filterJournalTransactionsByDescriptionfilterJournalTransactionsByDate(filterJournalTransactionsByClearedStatus$filterJournalPostingsByClearedStatusfilterJournalPostingsByRealnessfilterJournalPostingsByEmpty filterJournalTransactionsByDepthfilterJournalPostingsByDepth"filterJournalTransactionsByAccountfilterJournalPostingsByAccountjournalSelectingDatecanonicaliseAmountsjournalAmountsjournalCommoditiesjournalPrecisionsjournalConvertTimeLogjournalDateSpan matchpats crunchJournal groupPostingscalculateBalancespostingsByAccount LedgerFileCtxCtxctxYear ctxCommod ctxAccount JournalUpdateemptyCtxsetYeargetYearpushParentAccountpopParentAccountgetParentAccount expandPathparseLedgerFile parseLedger ledgerFile emptyLine ledgercommentledgercommentlineledgerExclamationDirective ledgerIncludeledgerAccountBeginledgerAccountEndledgerModifierTransactionledgerPeriodicTransactionledgerHistoricalPriceledgerIgnoredPriceCommodityledgerDefaultCommodityledgerCommodityConversionledgerTagDirectiveledgerEndTagDirectiveledgerDefaultYearledgerTransaction ledgerdateledgerfulldateledgerpartialdateledgerdatetimeledgereffectivedate ledgerstatus ledgercodeledgerpostingslinebeginningwithspaces ledgerpostingtransactionaccountnameledgeraccountname postingamount someamountleftsymbolamountrightsymbolamountnosymbolamountcommoditysymbolquotedcommoditysymbol priceamountamountquantity numberpartsnumberpartsstartingwithdigitnumberpartsstartingwithpoint timelogentrydatedisplayexpr CachedLedger nullledger cacheLedger cacheLedger'ledgerAccountNames ledgerAccountledgerAccountsledgerTopAccountsledgerAccountsMatchingledgerSubAccountsledgerPostingsledgerAccountTreeledgerAccountTreeAtledgerDateSpan accountnamesaccountaccounts topaccountsaccountsmatching subaccountspostings commodities accounttree accounttreeat rawdatespan ledgeramounts myLedgerPath myTimelogPathmyLedger myTimelog readLedgerjournalFromString tests_LedgerbaseGHC.Base++foldrGHC.Listconcatfilterzipmap GHC.Classes>=fail>>=>>returnMonadFunctorOrd Control.Monad MonadPlusghc-prim GHC.TypesChar GHC.OrderingOrderingString HUnit-1.2.2.1Test.HUnit.Text runTestTTshowPath showCounts runTestTextputTextToShowSputTextToHandlePutTextTest.HUnit.Base performTest testCaseCount testCasePaths~:~?=~=?~?@?=@=?@? assertEqual assertString assertBoolassert Assertable listAssertListAssertableAssertionPredicateassertionPredicateAssertionPredicableTestCaseTestList TestLabelTesttestTestablefailureserrorstriedcasesCountscountspathState ReportStart ReportProblemPathListItemLabelNodeTest.HUnit.Lang assertFailure Assertion Text.PrintfhPrintfprintf PrintfType HPrintfType PrintfArgIsChar Debug.Trace traceShowtrace putTraceMsg Data.Listunwordswordsunlineslinesproductsumfoldl1'foldl1foldl'unfoldrsortsortBy permutations subsequencestailsinitsgroupBygroupdeleteFirstsByunzip7unzip6unzip5unzip4zipWith7zipWith6zipWith5zipWith4zip7zip6zip5zip4genericReplicate genericIndexgenericSplitAt genericDrop genericTake genericLength minimumBy maximumByminimummaximuminsertByinsert mapAccumR mapAccumL partition transpose intercalate intersperse intersectBy intersectunionByunion\\deleteBydeletenubBynub isInfixOf isSuffixOf isPrefixOf findIndices findIndexfind elemIndices elemIndex stripPrefix Data.Char isSeparatorisSymbol isPunctuationisNumberisMarkisLettergeneralCategory digitToIntUppercaseLetterLowercaseLetterTitlecaseLetterModifierLetter OtherLetterNonSpacingMarkSpacingCombiningMark EnclosingMark DecimalNumber LetterNumber OtherNumberConnectorPunctuationDashPunctuationOpenPunctuationClosePunctuation InitialQuote FinalQuoteOtherPunctuation MathSymbolCurrencySymbolModifierSymbol OtherSymbolSpace LineSeparatorParagraphSeparatorControlFormat Surrogate PrivateUse NotAssignedGeneralCategory GHC.UnicodetoTitletoUppertoLower isAsciiUpper isAsciiLowerGHC.Read readLitChar lexLitCharData.Ord comparingapliftM5liftM4liftM3liftM2liftMunlesswhen replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMjoinforever<=<>=>msumforM_forMfilterMguardmapM_mapM sequence_sequence=<<mplusmzeroGHC.Show intToDigit showLitCharunzip3unzipzipWith3zipWithzip3!! concatMaplookupnotElemelemallanyorandreversebreakspansplitAtdroptake dropWhile takeWhilecycle replicaterepeatiteratescanr1scanrfoldr1scanl1scanlfoldllengthnullinitlasttailhead Data.MaybemapMaybe catMaybes listToMaybe maybeToList fromMaybefromJust isNothingisJustmaybeNothingJustMaybeordchrfmapminmax<=><compareisAsciiisLatin1 isControlisPrintisSpaceisUpperisLowerisAlphaisDigit isOctDigit isHexDigit isAlphaNumGTEQLTcontainers-0.3.0.0 Data.TreeunfoldForestM_BFunfoldTreeM_BF unfoldForestM unfoldTreeM unfoldForest unfoldTreelevelsflatten drawForestdrawTree subForest rootLabelTreeForest regexpr-0.5.1 Text.RegexPR splitRegexPR gsubRegexPRBy gsubRegexPR subRegexPRBy subRegexPR gmatchRegexPRmultiMatchRegexPR matchRegexPRggetbrsRegexPR getbrsRegexPR time-1.1.4Data.Time.LocalTime.LocalTimeutcToLocalZonedTime getZonedTimezonedTimeToUTCutcToZonedTimelocalTimeToUT1ut1ToLocalTimelocalTimeToUTCutcToLocalTimelocalTimeOfDaylocalDay LocalTime zonedTimeZonezonedTimeToLocalTime ZonedTimeData.Time.LocalTime.TimeOfDaytimeOfDayToDayFractiondayFractionToTimeOfDaytimeOfDayToTimetimeToTimeOfDaylocalToUTCTimeOfDayutcToLocalTimeOfDaymakeTimeOfDayValidmiddaymidnighttodSectodMintodHour TimeOfDayData.Time.LocalTime.TimeZonegetCurrentTimeZone getTimeZoneutctimeZoneOffsetStringtimeZoneOffsetString'hoursToTimeZoneminutesToTimeZone timeZoneNametimeZoneSummerOnlytimeZoneMinutesTimeZoneData.Time.ClockgetCurrentTimeData.Time.Clock.UTCDiff diffUTCTime addUTCTimeData.Time.Clock.UTC utctDayTimeutctDayUTCTimeNominalDiffTimeData.Time.Calendar.GregorianaddGregorianYearsRollOveraddGregorianYearsClipaddGregorianMonthsRollOveraddGregorianMonthsClipgregorianMonthLength showGregorianfromGregorianValid fromGregorian toGregorianData.Time.Calendar.OrdinalDate isLeapYearData.Time.Calendar.DaysdiffDaysaddDaystoModifiedJulianDayModifiedJulianDayDayData.Time.Clock.ScalepicosecondsToDiffTimesecondsToDiffTimegetModJulianDate ModJulianDate UniversalTimeDiffTime lowercase uppercasestriplstriprstripdropws elideLeft elideRightrootsubsbranches tracewith parseerrorshowParseErrorshowDateParseErrornextday startofdaythisweekprevweeknextweek startofweek thismonth prevmonth nextmonth startofmonth thisquarter prevquarter nextquarterstartofquarterthisyearprevyearnextyear startofyear firstJust datesepcharmonths monthabbrevsweekdaysweekdayabbrevs monthIndexmonIndex nulldatespannulldate tests_DatesunknowndollareuropoundhourdollarseurospoundshoursdefaultcommoditiesnegateAmountPreservingPricesumAmountsDiscardingPrice#sumSamePricedAmountsPreservingPrice6sumSamePricedAmountsPreservingPriceAndHighestPrecision tests_Amount acctsepcharaccountNameTreeFrom1nullaccountnametreeaccountNameTreeFrom2accountNameTreeFrom3 emptyTree nullpostingshowPostingForRegisterpostingTypeFromAccountNametests_Transaction compareop tests_Parse entry1_strentry1nullacct cacheLedger'' ledgerenvvar timelogenvvarledgerdefaultfilenametimelogdefaultfilenamenullfilterspec