Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 6a806edc410677c1fd1cd473b6901408 > files > 154

ghc-hledger-lib-devel-0.14-2.fc15.i686.rpm

<?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>&gt; Journal                  -- a journal is derived from one or more data files. It contains..
<a name="line-8"></a>&gt;  [Transaction]           -- journal transactions, which have date, status, code, description and..
<a name="line-9"></a>&gt;   [Posting]              -- multiple account postings (entries), which have account name and amount.
<a name="line-10"></a>&gt;  [HistoricalPrice]       -- historical commodity prices
<a name="line-11"></a>&gt;
<a name="line-12"></a>&gt; 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>&gt;  Journal                 -- the filtered journal, containing only the transactions and postings we are interested in
<a name="line-14"></a>&gt;  Tree AccountName        -- account names referenced in the journal's transactions, as a tree
<a name="line-15"></a>&gt;  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'>&amp;&amp;</span> <span class='hs-varid'>b1</span><span class='hs-varop'>==</span><span class='hs-varid'>b2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>c1</span><span class='hs-varop'>==</span><span class='hs-varid'>c2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>d1</span><span class='hs-varop'>==</span><span class='hs-varid'>d2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>e1</span><span class='hs-varop'>==</span><span class='hs-varid'>e2</span> <span class='hs-varop'>&amp;&amp;</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'>-- &amp; 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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</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>