move type docs to the corresponding module descriptions and update
This commit is contained in:
parent
7f5d85cea4
commit
6ce6029c7a
@ -1,5 +1,10 @@
|
|||||||
{-|
|
{-|
|
||||||
|
|
||||||
|
The Ledger package allows parsing and querying of ledger files.
|
||||||
|
It generally provides a compatible subset of C++ ledger's functionality.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Ledger (
|
module Ledger (
|
||||||
module Ledger.Types,
|
module Ledger.Types,
|
||||||
module Ledger.Currency,
|
module Ledger.Currency,
|
||||||
|
|||||||
@ -1,3 +1,11 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
An 'Account' stores an account name, all transactions in the account
|
||||||
|
(excluding any subaccounts), and the total balance (including any
|
||||||
|
subaccounts).
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.Account
|
module Ledger.Account
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
'AccountName's are strings like @assets:cash:petty@.
|
||||||
|
From a set of these we derive the account hierarchy.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.AccountName
|
module Ledger.AccountName
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
@ -49,8 +56,8 @@ subAccountNamesFrom accts a = filter (`isSubAccountNameOf` a) accts
|
|||||||
-- | We could almost get by with just the AccountName manipulations
|
-- | We could almost get by with just the AccountName manipulations
|
||||||
-- above, but we need smarter structures to eg display the account
|
-- above, but we need smarter structures to eg display the account
|
||||||
-- tree with boring accounts elided. This converts a list of
|
-- tree with boring accounts elided. This converts a list of
|
||||||
-- AccountNames to a tree (later we will convert that to a tree of
|
-- AccountName to a tree (later we will convert that to a tree of
|
||||||
-- Accounts.)
|
-- 'Account'.)
|
||||||
accountNameTreeFrom_props =
|
accountNameTreeFrom_props =
|
||||||
[
|
[
|
||||||
accountNameTreeFrom ["a"] == Node "top" [Node "a" []],
|
accountNameTreeFrom ["a"] == Node "top" [Node "a" []],
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
{-|
|
{-|
|
||||||
A simple amount is a currency, quantity pair:
|
An 'Amount' is some quantity of money, shares, or anything else.
|
||||||
|
|
||||||
|
A simple amount is a currency, quantity pair (where currency can be anything):
|
||||||
|
|
||||||
@
|
@
|
||||||
$1
|
$1
|
||||||
@ -7,11 +9,11 @@ A simple amount is a currency, quantity pair:
|
|||||||
EUR 3.44
|
EUR 3.44
|
||||||
GOOG 500
|
GOOG 500
|
||||||
1.5h
|
1.5h
|
||||||
90m
|
90apples
|
||||||
0
|
0
|
||||||
@
|
@
|
||||||
|
|
||||||
A mixed amount is one or more simple amounts:
|
A mixed amount (not yet implemented) is one or more simple amounts:
|
||||||
|
|
||||||
@
|
@
|
||||||
$50, EUR 3, AAPL 500
|
$50, EUR 3, AAPL 500
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'Currency' is a symbol and a conversion rate relative to the
|
||||||
|
dollar. Currency symbols are parsed from the ledger file, rates are
|
||||||
|
currently hard-coded.
|
||||||
|
|
||||||
|
-}
|
||||||
module Ledger.Currency
|
module Ledger.Currency
|
||||||
where
|
where
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'Ledger' stores, for efficiency, a 'RawLedger' plus its tree of account
|
||||||
|
names, a map from account names to 'Account's, and the display precision.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.Ledger
|
module Ledger.Ledger
|
||||||
where
|
where
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'LedgerEntry' represents a normal entry in the ledger file. It contains
|
||||||
|
two or more 'RawTransaction's which balance.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.LedgerEntry
|
module Ledger.LedgerEntry
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'RawLedger' is a parsed ledger file. We call it raw to distinguish from
|
||||||
|
the cached 'Ledger'.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.RawLedger
|
module Ledger.RawLedger
|
||||||
where
|
where
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'RawTransaction' represents a single transaction line within a ledger
|
||||||
|
entry. We call it raw to distinguish from the cached 'Transaction'.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.RawTransaction
|
module Ledger.RawTransaction
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'TimeLog' is a parsed timelog file (generated by timeclock.el).
|
||||||
|
It contains zero or more 'TimeLogEntry's.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.TimeLog
|
module Ledger.TimeLog
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
|
{-|
|
||||||
|
|
||||||
|
A 'Transaction' is a 'RawTransaction' with its parent 'LedgerEntry' \'s
|
||||||
|
date and description attached, for easier querying.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.Transaction
|
module Ledger.Transaction
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
@ -13,7 +20,9 @@ instance Show Transaction where
|
|||||||
show (Transaction eno d desc a amt) =
|
show (Transaction eno d desc a amt) =
|
||||||
unwords [d,desc,a,show amt]
|
unwords [d,desc,a,show amt]
|
||||||
|
|
||||||
-- | we use the entry number e to remember the grouping of txns
|
-- | Convert a 'LedgerEntry' to two or more 'Transaction's. An id number
|
||||||
|
-- is attached to the transactions to preserve their grouping - it should
|
||||||
|
-- be unique per entry.
|
||||||
flattenEntry :: (LedgerEntry, Int) -> [Transaction]
|
flattenEntry :: (LedgerEntry, Int) -> [Transaction]
|
||||||
flattenEntry (LedgerEntry d _ _ desc _ ts _, e) =
|
flattenEntry (LedgerEntry d _ _ desc _ ts _, e) =
|
||||||
[Transaction e d desc (taccount t) (tamount t) | t <- ts]
|
[Transaction e d desc (taccount t) (tamount t) | t <- ts]
|
||||||
|
|||||||
@ -1,36 +1,32 @@
|
|||||||
{-|
|
{-|
|
||||||
|
|
||||||
All the main data types, defined here to avoid import cycles.
|
All the main data types, defined here to avoid import cycles.
|
||||||
|
See the corresponding modules for documentation.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Ledger.Types
|
module Ledger.Types
|
||||||
where
|
where
|
||||||
import Ledger.Utils
|
import Ledger.Utils
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
|
||||||
-- | a date
|
|
||||||
type Date = String
|
type Date = String
|
||||||
|
|
||||||
-- | a date and time
|
|
||||||
type DateTime = String
|
type DateTime = String
|
||||||
|
|
||||||
-- | the currency of an Amount.
|
|
||||||
data Currency = Currency {
|
data Currency = Currency {
|
||||||
symbol :: String,
|
symbol :: String,
|
||||||
rate :: Double -- ^ relative to the dollar (rates are currently hardcoded)
|
rate :: Double
|
||||||
} deriving (Eq,Show)
|
} deriving (Eq,Show)
|
||||||
|
|
||||||
-- | some amount of money, shares, or anything else.
|
|
||||||
data Amount = Amount {
|
data Amount = Amount {
|
||||||
currency :: Currency,
|
currency :: Currency,
|
||||||
quantity :: Double,
|
quantity :: Double,
|
||||||
precision :: Int -- ^ number of significant decimal places
|
precision :: Int -- ^ number of significant decimal places
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
|
|
||||||
-- | AccountNames are strings like @assets:cash:petty@, from which we derive
|
|
||||||
-- the chart of accounts
|
|
||||||
type AccountName = String
|
type AccountName = String
|
||||||
|
|
||||||
-- | a single transaction line within a ledger entry. We call it raw to
|
|
||||||
-- distinguish from the cached 'Transaction'.
|
|
||||||
data RawTransaction = RawTransaction {
|
data RawTransaction = RawTransaction {
|
||||||
taccount :: AccountName,
|
taccount :: AccountName,
|
||||||
tamount :: Amount,
|
tamount :: Amount,
|
||||||
@ -49,7 +45,6 @@ data PeriodicEntry = PeriodicEntry {
|
|||||||
p_transactions :: [RawTransaction]
|
p_transactions :: [RawTransaction]
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
|
|
||||||
-- | a regular ledger entry, containing two or more transactions which balance
|
|
||||||
data LedgerEntry = LedgerEntry {
|
data LedgerEntry = LedgerEntry {
|
||||||
edate :: Date,
|
edate :: Date,
|
||||||
estatus :: Bool,
|
estatus :: Bool,
|
||||||
@ -60,8 +55,6 @@ data LedgerEntry = LedgerEntry {
|
|||||||
epreceding_comment_lines :: String
|
epreceding_comment_lines :: String
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
|
|
||||||
-- | a parsed ledger file. We call it raw to distinguish from the cached
|
|
||||||
-- 'Ledger'.
|
|
||||||
data RawLedger = RawLedger {
|
data RawLedger = RawLedger {
|
||||||
modifier_entries :: [ModifierEntry],
|
modifier_entries :: [ModifierEntry],
|
||||||
periodic_entries :: [PeriodicEntry],
|
periodic_entries :: [PeriodicEntry],
|
||||||
@ -69,22 +62,16 @@ data RawLedger = RawLedger {
|
|||||||
final_comment_lines :: String
|
final_comment_lines :: String
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
|
|
||||||
-- | a timelog entry in a timelog file (generated by timeclock.el)
|
|
||||||
data TimeLogEntry = TimeLogEntry {
|
data TimeLogEntry = TimeLogEntry {
|
||||||
tlcode :: Char,
|
tlcode :: Char,
|
||||||
tldatetime :: DateTime,
|
tldatetime :: DateTime,
|
||||||
tlcomment :: String
|
tlcomment :: String
|
||||||
} deriving (Eq,Ord)
|
} deriving (Eq,Ord)
|
||||||
|
|
||||||
-- | a parsed timelog file
|
|
||||||
data TimeLog = TimeLog {
|
data TimeLog = TimeLog {
|
||||||
timelog_entries :: [TimeLogEntry]
|
timelog_entries :: [TimeLogEntry]
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
|
|
||||||
-- | optimisations: these types provide some caching and are easier to work with.
|
|
||||||
--
|
|
||||||
-- A Transaction is a RawTransaction with some of its parent
|
|
||||||
-- LedgerEntry's data attached.
|
|
||||||
data Transaction = Transaction {
|
data Transaction = Transaction {
|
||||||
entryno :: Int,
|
entryno :: Int,
|
||||||
date :: Date,
|
date :: Date,
|
||||||
@ -93,16 +80,12 @@ data Transaction = Transaction {
|
|||||||
amount :: Amount
|
amount :: Amount
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
|
|
||||||
-- | an Account stores an account name, all transactions in the account
|
|
||||||
-- (excluding subaccounts), and the total balance (including subaccounts).
|
|
||||||
data Account = Account {
|
data Account = Account {
|
||||||
aname :: AccountName,
|
aname :: AccountName,
|
||||||
atransactions :: [Transaction],
|
atransactions :: [Transaction],
|
||||||
abalance :: Amount
|
abalance :: Amount
|
||||||
}
|
}
|
||||||
|
|
||||||
-- | a raw ledger plus its tree of account names, a map from account names
|
|
||||||
-- to Accounts, and the preferred precision.
|
|
||||||
data Ledger = Ledger {
|
data Ledger = Ledger {
|
||||||
rawledger :: RawLedger,
|
rawledger :: RawLedger,
|
||||||
accountnametree :: Tree AccountName,
|
accountnametree :: Tree AccountName,
|
||||||
|
|||||||
@ -1,4 +1,9 @@
|
|||||||
-- standard always-available imports and utilities
|
{-|
|
||||||
|
|
||||||
|
Standard always-available imports and utilities.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
module Ledger.Utils (
|
module Ledger.Utils (
|
||||||
module Ledger.Utils,
|
module Ledger.Utils,
|
||||||
module Char,
|
module Char,
|
||||||
|
|||||||
@ -93,7 +93,7 @@ wildcard :: Regex
|
|||||||
wildcard = mkRegex ".*"
|
wildcard = mkRegex ".*"
|
||||||
|
|
||||||
-- | parse the user's specified ledger file and do some action with it
|
-- | parse the user's specified ledger file and do some action with it
|
||||||
-- (or report a parse error)
|
-- (or report a parse error). This function makes the whole thing go.
|
||||||
parseLedgerAndDo :: [Flag] -> (Regex,Regex) -> (Ledger -> IO ()) -> IO ()
|
parseLedgerAndDo :: [Flag] -> (Regex,Regex) -> (Ledger -> IO ()) -> IO ()
|
||||||
parseLedgerAndDo opts pats cmd = do
|
parseLedgerAndDo opts pats cmd = do
|
||||||
path <- ledgerFilePath opts
|
path <- ledgerFilePath opts
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user