<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ --> <title>Hledger/Data/Types.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE DeriveDataTypeable #-}</span> <a name="line-2"></a><span class='hs-comment'>{-| <a name="line-3"></a> <a name="line-4"></a>Most data types are defined here to avoid import cycles. <a name="line-5"></a>Here is an overview of the hledger data model: <a name="line-6"></a> <a name="line-7"></a>> Journal -- a journal is derived from one or more data files. It contains.. <a name="line-8"></a>> [Transaction] -- journal transactions, which have date, status, code, description and.. <a name="line-9"></a>> [Posting] -- multiple account postings (entries), which have account name and amount. <a name="line-10"></a>> [HistoricalPrice] -- historical commodity prices <a name="line-11"></a>> <a name="line-12"></a>> Ledger -- a ledger is derived from a journal, by applying a filter specification and doing some further processing. It contains.. <a name="line-13"></a>> Journal -- the filtered journal, containing only the transactions and postings we are interested in <a name="line-14"></a>> Tree AccountName -- account names referenced in the journal's transactions, as a tree <a name="line-15"></a>> Map AccountName Account -- per-account postings and balances from the journal's transactions, as a map from account name to account info <a name="line-16"></a> <a name="line-17"></a>For more detailed documentation on each type, see the corresponding modules. <a name="line-18"></a> <a name="line-19"></a>Evolution of transaction\/entry\/posting terminology: <a name="line-20"></a> <a name="line-21"></a> - ledger 2: entries contain transactions <a name="line-22"></a> <a name="line-23"></a> - hledger 0.4: Entrys contain RawTransactions (which are flattened to Transactions) <a name="line-24"></a> <a name="line-25"></a> - ledger 3: transactions contain postings <a name="line-26"></a> <a name="line-27"></a> - hledger 0.5: LedgerTransactions contain Postings (which are flattened to Transactions) <a name="line-28"></a> <a name="line-29"></a> - hledger 0.8: Transactions contain Postings (referencing Transactions..) <a name="line-30"></a> <a name="line-31"></a>-}</span> <a name="line-32"></a> <a name="line-33"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Hledger</span><span class='hs-varop'>.</span><span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span> <a name="line-34"></a><span class='hs-keyword'>where</span> <a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span> <span class='hs-layout'>(</span><span class='hs-conid'>ErrorT</span><span class='hs-layout'>)</span> <a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span> <a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Map</span> <a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClockTime</span><span class='hs-layout'>)</span> <a name="line-39"></a> <a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Hledger</span><span class='hs-varop'>.</span><span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span> <a name="line-41"></a> <a name="line-42"></a> <a name="line-43"></a><a name="SmartDate"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SmartDate</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span> <a name="line-44"></a> <a name="line-45"></a><a name="WhichDate"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>WhichDate</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ActualDate</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>EffectiveDate</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span> <a name="line-46"></a> <a name="line-47"></a><a name="DateSpan"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>DateSpan</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DateSpan</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Day</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Day</span><span class='hs-layout'>)</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-48"></a> <a name="line-49"></a><a name="Interval"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Interval</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoInterval</span> <a name="line-50"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Days</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Weeks</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Months</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Quarters</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Years</span> <span class='hs-conid'>Int</span> <a name="line-51"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DayOfMonth</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DayOfWeek</span> <span class='hs-conid'>Int</span> <a name="line-52"></a> <span class='hs-comment'>-- WeekOfYear Int | MonthOfYear Int | QuarterOfYear Int</span> <a name="line-53"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-54"></a> <a name="line-55"></a><a name="AccountName"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>AccountName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span> <a name="line-56"></a> <a name="line-57"></a><a name="Side"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Side</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>R</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-58"></a> <a name="line-59"></a><a name="Commodity"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Commodity</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Commodity</span> <span class='hs-layout'>{</span> <a name="line-60"></a> <span class='hs-varid'>symbol</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ the commodity's symbol</span> <a name="line-61"></a> <span class='hs-comment'>-- display preferences for amounts of this commodity</span> <a name="line-62"></a> <span class='hs-varid'>side</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Side</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ should the symbol appear on the left or the right</span> <a name="line-63"></a> <span class='hs-varid'>spaced</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ should there be a space between symbol and quantity</span> <a name="line-64"></a> <span class='hs-varid'>precision</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ number of decimal places to display</span> <a name="line-65"></a> <span class='hs-comment'>-- XXX these three might be better belonging to Journal</span> <a name="line-66"></a> <span class='hs-varid'>decimalpoint</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ character to use as decimal point</span> <a name="line-67"></a> <span class='hs-varid'>separator</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ character to use for separating digit groups (eg thousands)</span> <a name="line-68"></a> <span class='hs-varid'>separatorpositions</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Int</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ positions of separators, counting leftward from decimal point</span> <a name="line-69"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Read</span><span class='hs-layout'>)</span> <a name="line-70"></a> <a name="line-71"></a><a name="Price"></a><span class='hs-comment'>-- | An amount's price may be written as \@ unit price or \@\@ total price.</span> <a name="line-72"></a><a name="Price"></a><span class='hs-comment'>-- Note although Price has a MixedAmount, it should hold only</span> <a name="line-73"></a><a name="Price"></a><span class='hs-comment'>-- single-commodity amounts, cf costOfAmount.</span> <a name="line-74"></a><a name="Price"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Price</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UnitPrice</span> <span class='hs-conid'>MixedAmount</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TotalPrice</span> <span class='hs-conid'>MixedAmount</span> <a name="line-75"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-76"></a> <a name="line-77"></a><a name="Amount"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Amount</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Amount</span> <span class='hs-layout'>{</span> <a name="line-78"></a> <span class='hs-varid'>commodity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Commodity</span><span class='hs-layout'>,</span> <a name="line-79"></a> <span class='hs-varid'>quantity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Double</span><span class='hs-layout'>,</span> <a name="line-80"></a> <span class='hs-varid'>price</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Price</span> <span class='hs-comment'>-- ^ the price for this amount at posting time</span> <a name="line-81"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-82"></a> <a name="line-83"></a><a name="MixedAmount"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>MixedAmount</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Mixed</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Amount</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-84"></a> <a name="line-85"></a><a name="PostingType"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PostingType</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RegularPosting</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>VirtualPosting</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BalancedVirtualPosting</span> <a name="line-86"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span> <a name="line-87"></a> <a name="line-88"></a><a name="Posting"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Posting</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Posting</span> <span class='hs-layout'>{</span> <a name="line-89"></a> <span class='hs-varid'>pstatus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>,</span> <a name="line-90"></a> <span class='hs-varid'>paccount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AccountName</span><span class='hs-layout'>,</span> <a name="line-91"></a> <span class='hs-varid'>pamount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MixedAmount</span><span class='hs-layout'>,</span> <a name="line-92"></a> <span class='hs-varid'>pcomment</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-93"></a> <span class='hs-varid'>ptype</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PostingType</span><span class='hs-layout'>,</span> <a name="line-94"></a> <span class='hs-varid'>pmetadata</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-95"></a> <span class='hs-varid'>ptransaction</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Transaction</span> <span class='hs-comment'>-- ^ this posting's parent transaction (co-recursive types).</span> <a name="line-96"></a> <span class='hs-comment'>-- Tying this knot gets tedious, Maybe makes it easier/optional.</span> <a name="line-97"></a> <span class='hs-layout'>}</span> <a name="line-98"></a> <a name="line-99"></a><span class='hs-comment'>-- The equality test for postings ignores the parent transaction's</span> <a name="line-100"></a><span class='hs-comment'>-- identity, to avoid infinite loops.</span> <a name="line-101"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>Posting</span> <span class='hs-keyword'>where</span> <a name="line-102"></a> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Posting</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>b1</span> <span class='hs-varid'>c1</span> <span class='hs-varid'>d1</span> <span class='hs-varid'>e1</span> <span class='hs-varid'>f1</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Posting</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>b2</span> <span class='hs-varid'>c2</span> <span class='hs-varid'>d2</span> <span class='hs-varid'>e2</span> <span class='hs-varid'>f2</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a1</span><span class='hs-varop'>==</span><span class='hs-varid'>a2</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>b1</span><span class='hs-varop'>==</span><span class='hs-varid'>b2</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>c1</span><span class='hs-varop'>==</span><span class='hs-varid'>c2</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>d1</span><span class='hs-varop'>==</span><span class='hs-varid'>d2</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>e1</span><span class='hs-varop'>==</span><span class='hs-varid'>e2</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>f1</span><span class='hs-varop'>==</span><span class='hs-varid'>f2</span> <a name="line-103"></a> <a name="line-104"></a><a name="Transaction"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Transaction</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Transaction</span> <span class='hs-layout'>{</span> <a name="line-105"></a> <span class='hs-varid'>tdate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Day</span><span class='hs-layout'>,</span> <a name="line-106"></a> <span class='hs-varid'>teffectivedate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Day</span><span class='hs-layout'>,</span> <a name="line-107"></a> <span class='hs-varid'>tstatus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- XXX tcleared ?</span> <a name="line-108"></a> <span class='hs-varid'>tcode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-109"></a> <span class='hs-varid'>tdescription</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-110"></a> <span class='hs-varid'>tcomment</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-111"></a> <span class='hs-varid'>tmetadata</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-112"></a> <span class='hs-varid'>tpostings</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Posting</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ this transaction's postings (co-recursive types).</span> <a name="line-113"></a> <span class='hs-varid'>tpreceding_comment_lines</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <a name="line-114"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span> <a name="line-115"></a> <a name="line-116"></a><a name="ModifierTransaction"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModifierTransaction</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModifierTransaction</span> <span class='hs-layout'>{</span> <a name="line-117"></a> <span class='hs-varid'>mtvalueexpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-118"></a> <span class='hs-varid'>mtpostings</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Posting</span><span class='hs-keyglyph'>]</span> <a name="line-119"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span> <a name="line-120"></a> <a name="line-121"></a><a name="PeriodicTransaction"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PeriodicTransaction</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PeriodicTransaction</span> <span class='hs-layout'>{</span> <a name="line-122"></a> <span class='hs-varid'>ptperiodicexpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-123"></a> <span class='hs-varid'>ptpostings</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Posting</span><span class='hs-keyglyph'>]</span> <a name="line-124"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span> <a name="line-125"></a> <a name="line-126"></a><a name="TimeLogCode"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TimeLogCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SetBalance</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SetRequiredHours</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>In</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Out</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FinalOut</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-127"></a> <a name="line-128"></a><a name="TimeLogEntry"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TimeLogEntry</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TimeLogEntry</span> <span class='hs-layout'>{</span> <a name="line-129"></a> <span class='hs-varid'>tlcode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TimeLogCode</span><span class='hs-layout'>,</span> <a name="line-130"></a> <span class='hs-varid'>tldatetime</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LocalTime</span><span class='hs-layout'>,</span> <a name="line-131"></a> <span class='hs-varid'>tlcomment</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <a name="line-132"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-133"></a> <a name="line-134"></a><a name="HistoricalPrice"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HistoricalPrice</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HistoricalPrice</span> <span class='hs-layout'>{</span> <a name="line-135"></a> <span class='hs-varid'>hdate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Day</span><span class='hs-layout'>,</span> <a name="line-136"></a> <span class='hs-varid'>hsymbol</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <a name="line-137"></a> <span class='hs-varid'>hamount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MixedAmount</span> <a name="line-138"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- & Show (in Amount.hs)</span> <a name="line-139"></a> <a name="line-140"></a><a name="Year"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Year</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Integer</span> <a name="line-141"></a> <a name="line-142"></a><a name="JournalContext"></a><span class='hs-comment'>-- | A journal "context" is some data which can change in the course of</span> <a name="line-143"></a><a name="JournalContext"></a><span class='hs-comment'>-- parsing a journal. An example is the default year, which changes when a</span> <a name="line-144"></a><a name="JournalContext"></a><span class='hs-comment'>-- Y directive is encountered. At the end of parsing, the final context</span> <a name="line-145"></a><a name="JournalContext"></a><span class='hs-comment'>-- is saved for later use by eg the add command.</span> <a name="line-146"></a><a name="JournalContext"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>JournalContext</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ctx</span> <span class='hs-layout'>{</span> <a name="line-147"></a> <span class='hs-varid'>ctxYear</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Year</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ the default year most recently specified with Y</span> <a name="line-148"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>ctxCommodity</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Commodity</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ the default commodity most recently specified with D</span> <a name="line-149"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>ctxAccount</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>AccountName</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ the current stack of parent accounts specified by !account</span> <a name="line-150"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>)</span> <a name="line-151"></a> <a name="line-152"></a><a name="Journal"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Journal</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Journal</span> <span class='hs-layout'>{</span> <a name="line-153"></a> <span class='hs-varid'>jmodifiertxns</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ModifierTransaction</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-154"></a> <span class='hs-varid'>jperiodictxns</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PeriodicTransaction</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-155"></a> <span class='hs-varid'>jtxns</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Transaction</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-156"></a> <span class='hs-varid'>open_timelog_entries</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TimeLogEntry</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-157"></a> <span class='hs-varid'>historical_prices</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HistoricalPrice</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-158"></a> <span class='hs-varid'>final_comment_lines</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ any trailing comments from the journal file</span> <a name="line-159"></a> <span class='hs-varid'>jContext</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>JournalContext</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ the context (parse state) at the end of parsing</span> <a name="line-160"></a> <span class='hs-varid'>files</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ the file path and raw text of the main and</span> <a name="line-161"></a> <span class='hs-comment'>-- any included journal files. The main file is</span> <a name="line-162"></a> <span class='hs-comment'>-- first followed by any included files in the</span> <a name="line-163"></a> <span class='hs-comment'>-- order encountered.</span> <a name="line-164"></a> <span class='hs-varid'>filereadtime</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ClockTime</span> <span class='hs-comment'>-- ^ when this journal was last read from its file(s)</span> <a name="line-165"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span> <a name="line-166"></a> <a name="line-167"></a><a name="JournalUpdate"></a><span class='hs-comment'>-- | A JournalUpdate is some transformation of a Journal. It can do I/O or</span> <a name="line-168"></a><a name="JournalUpdate"></a><span class='hs-comment'>-- raise an error.</span> <a name="line-169"></a><a name="JournalUpdate"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>JournalUpdate</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ErrorT</span> <span class='hs-conid'>String</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Journal</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Journal</span><span class='hs-layout'>)</span> <a name="line-170"></a> <a name="line-171"></a><a name="Reader"></a><span class='hs-comment'>-- | A hledger journal reader is a triple of format name, format-detecting</span> <a name="line-172"></a><a name="Reader"></a><span class='hs-comment'>-- predicate, and a parser to Journal.</span> <a name="line-173"></a><a name="Reader"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Reader</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Reader</span> <span class='hs-layout'>{</span><span class='hs-varid'>rFormat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <a name="line-174"></a> <span class='hs-layout'>,</span><span class='hs-varid'>rDetector</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-175"></a> <span class='hs-layout'>,</span><span class='hs-varid'>rParser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ErrorT</span> <span class='hs-conid'>String</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Journal</span> <a name="line-176"></a> <span class='hs-layout'>}</span> <a name="line-177"></a> <a name="line-178"></a><a name="Ledger"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Ledger</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ledger</span> <span class='hs-layout'>{</span> <a name="line-179"></a> <span class='hs-varid'>journal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Journal</span><span class='hs-layout'>,</span> <a name="line-180"></a> <span class='hs-varid'>accountnametree</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Tree</span> <span class='hs-conid'>AccountName</span><span class='hs-layout'>,</span> <a name="line-181"></a> <span class='hs-varid'>accountmap</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-conid'>AccountName</span> <span class='hs-conid'>Account</span> <a name="line-182"></a> <span class='hs-layout'>}</span> <a name="line-183"></a> <a name="line-184"></a><a name="Account"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Account</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Account</span> <span class='hs-layout'>{</span> <a name="line-185"></a> <span class='hs-varid'>aname</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AccountName</span><span class='hs-layout'>,</span> <a name="line-186"></a> <span class='hs-varid'>apostings</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Posting</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ postings in this account</span> <a name="line-187"></a> <span class='hs-varid'>abalance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MixedAmount</span> <span class='hs-comment'>-- ^ sum of postings in this account and subaccounts</span> <a name="line-188"></a> <span class='hs-layout'>}</span> <a name="line-189"></a> <a name="line-190"></a><a name="FilterSpec"></a><span class='hs-comment'>-- | A generic, pure specification of how to filter transactions and postings.</span> <a name="line-191"></a><a name="FilterSpec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FilterSpec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FilterSpec</span> <span class='hs-layout'>{</span> <a name="line-192"></a> <span class='hs-varid'>datespan</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DateSpan</span> <span class='hs-comment'>-- ^ only include if in this date span</span> <a name="line-193"></a> <span class='hs-layout'>,</span><span class='hs-varid'>cleared</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ only include if cleared\/uncleared\/don't care</span> <a name="line-194"></a> <span class='hs-layout'>,</span><span class='hs-varid'>real</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ only include if real\/don't care</span> <a name="line-195"></a> <span class='hs-layout'>,</span><span class='hs-varid'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ include if empty (ie amount is zero)</span> <a name="line-196"></a> <span class='hs-layout'>,</span><span class='hs-varid'>costbasis</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ convert all amounts to cost basis</span> <a name="line-197"></a> <span class='hs-layout'>,</span><span class='hs-varid'>acctpats</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ only include if matching these account patterns</span> <a name="line-198"></a> <span class='hs-layout'>,</span><span class='hs-varid'>descpats</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ only include if matching these description patterns</span> <a name="line-199"></a> <span class='hs-layout'>,</span><span class='hs-varid'>whichdate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WhichDate</span> <span class='hs-comment'>-- ^ which dates to use (actual or effective)</span> <a name="line-200"></a> <span class='hs-layout'>,</span><span class='hs-varid'>depth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Int</span> <a name="line-201"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span> <a name="line-202"></a> </pre></body> </html>