move around and clean up haddock comments
This commit is contained in:
		
							parent
							
								
									d85f1df7bc
								
							
						
					
					
						commit
						5a1452c5db
					
				| @ -46,11 +46,11 @@ s `isSubAccountNameOf` p = | ||||
| subAccountNamesFrom :: [AccountName] -> AccountName -> [AccountName] | ||||
| subAccountNamesFrom accts a = filter (`isSubAccountNameOf` a) accts | ||||
| 
 | ||||
| -- | We could almost get by with just the above, but we need smarter | ||||
| -- structures to eg display the account tree with boring accounts elided. | ||||
| -- first, here is a tree of AccountNames; Account and Account tree are | ||||
| -- defined later. | ||||
| 
 | ||||
| -- | We could almost get by with just the AccountName manipulations | ||||
| -- above, but we need smarter structures to eg display the account | ||||
| -- tree with boring accounts elided.  This converts a list of | ||||
| -- AccountNames to a tree (later we will convert that to a tree of | ||||
| -- Accounts.) | ||||
| accountNameTreeFrom_props = | ||||
|     [ | ||||
|      accountNameTreeFrom ["a"]       == Node "top" [Node "a" []], | ||||
|  | ||||
							
								
								
									
										19
									
								
								Amount.hs
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								Amount.hs
									
									
									
									
									
								
							| @ -1,6 +1,7 @@ | ||||
| {-| | ||||
| a simple amount is a currency, quantity pair: | ||||
| A simple amount is a currency, quantity pair: | ||||
| 
 | ||||
| @ | ||||
|   $1  | ||||
|   £-50 | ||||
|   EUR 3.44  | ||||
| @ -8,18 +9,20 @@ a simple amount is a currency, quantity pair: | ||||
|   1.5h | ||||
|   90m | ||||
|   0  | ||||
| @ | ||||
| 
 | ||||
| a mixed amount is one or more simple amounts: | ||||
| A mixed amount is one or more simple amounts: | ||||
| 
 | ||||
| @ | ||||
|   $50, EUR 3, AAPL 500 | ||||
|   16h, $13.55, oranges 6 | ||||
| @ | ||||
| 
 | ||||
| currencies may be convertible or not (eg, currencies representing | ||||
| Currencies may be convertible or not (eg, currencies representing | ||||
| non-money commodities). A mixed amount containing only convertible | ||||
| currencies can be converted to a simple amount. | ||||
| 
 | ||||
| arithmetic: | ||||
| currencies can be converted to a simple amount. Arithmetic examples: | ||||
| 
 | ||||
| @ | ||||
|   $1 - $5 = $-4 | ||||
|   $1 + EUR 0.76 = $2 | ||||
|   EUR0.76 + $1 = EUR 1.52 | ||||
| @ -28,7 +31,7 @@ arithmetic: | ||||
|   ($50, EUR 3, AAPL 500) + ($13.55, oranges 6) = $67.51, AAPL 500, oranges 6 | ||||
|   ($50, EUR 3) * $-1 = $-53.96 | ||||
|   ($50, AAPL 500) * $-1 = error | ||||
|     | ||||
| @    | ||||
| -} | ||||
| 
 | ||||
| module Amount | ||||
| @ -80,7 +83,7 @@ instance Num Amount where | ||||
|     (-) = amountop (-) | ||||
|     (*) = amountop (*) | ||||
| 
 | ||||
| -- | problem: when an integer is converted to an amount it must pick a | ||||
| -- problem: when an integer is converted to an amount it must pick a | ||||
| -- precision, which we specify here (should be infinite ?). This can | ||||
| -- affect amount arithmetic, in particular the sum of a list of amounts. | ||||
| -- So, we may need to adjust the precision after summing amounts. | ||||
|  | ||||
							
								
								
									
										146
									
								
								Ledger.hs
									
									
									
									
									
								
							
							
						
						
									
										146
									
								
								Ledger.hs
									
									
									
									
									
								
							| @ -110,74 +110,86 @@ ledgerAccountTree l depth = | ||||
| addDataToAccountNameTree :: Ledger -> Tree AccountName -> Tree Account | ||||
| addDataToAccountNameTree = treemap . ledgerAccount | ||||
| 
 | ||||
| -- | balance report support | ||||
| -- | ||||
| -- examples: here is a sample account tree: | ||||
| -- | ||||
| -- assets | ||||
| --  cash | ||||
| --  checking | ||||
| --  saving | ||||
| -- equity | ||||
| -- expenses | ||||
| --  food | ||||
| --  shelter | ||||
| -- income | ||||
| --  salary | ||||
| -- liabilities | ||||
| --  debts | ||||
| -- | ||||
| -- standard balance command shows all top-level accounts: | ||||
| -- | ||||
| -- > ledger bal | ||||
| -- | ||||
| --  $ assets       | ||||
| --  $ equity | ||||
| --  $ expenses     | ||||
| --  $ income       | ||||
| --  $ liabilities  | ||||
| -- | ||||
| -- with an account pattern, show only the ones with matching names: | ||||
| -- | ||||
| -- > ledger bal asset | ||||
| -- | ||||
| --  $ assets       | ||||
| -- | ||||
| -- with -s, show all subaccounts of matched accounts: | ||||
| -- | ||||
| -- > ledger -s bal asset | ||||
| -- | ||||
| --  $ assets       | ||||
| --  $  cash        | ||||
| --  $  checking    | ||||
| --  $  saving | ||||
| -- | ||||
| -- we elide boring accounts in two ways: | ||||
| -- | ||||
| -- - leaf accounts and branches with 0 balance or 0 transactions are omitted | ||||
| -- | ||||
| -- - inner accounts with 0 transactions and 1 subaccount are displayed inline | ||||
| -- | ||||
| -- so this: | ||||
| -- | ||||
| -- a (0 txns) | ||||
| --   b (0 txns) | ||||
| --     c | ||||
| --       d | ||||
| -- e (0 txns) | ||||
| --   f | ||||
| --   g | ||||
| -- h (0 txns) | ||||
| --   i (0 balance) | ||||
| -- | ||||
| -- is displayed like: | ||||
| -- | ||||
| -- a:b:c | ||||
| --   d | ||||
| -- e | ||||
| --   f | ||||
| --   g | ||||
| 
 | ||||
| {-|  | ||||
| This and the functions below help generate ledger-compatible balance | ||||
| reports. Here's how it should work: | ||||
| 
 | ||||
| a sample account tree: | ||||
| 
 | ||||
| @ | ||||
| assets | ||||
|  cash | ||||
|  checking | ||||
|  saving | ||||
| equity | ||||
| expenses | ||||
|  food | ||||
|  shelter | ||||
| income | ||||
|  salary | ||||
| liabilities | ||||
|  debts | ||||
| @ | ||||
| 
 | ||||
| the standard balance command shows all top-level accounts: | ||||
| 
 | ||||
| @ | ||||
| \> ledger balance | ||||
| $ assets       | ||||
| $ equity | ||||
| $ expenses     | ||||
| $ income       | ||||
| $ liabilities  | ||||
| @ | ||||
| 
 | ||||
| with an account pattern, show only the ones with matching names: | ||||
| 
 | ||||
| @ | ||||
| \> ledger balance asset | ||||
| $ assets       | ||||
| @ | ||||
| 
 | ||||
| with -s, show all subaccounts of matched accounts: | ||||
| 
 | ||||
| @ | ||||
| \> ledger -s balance asset | ||||
| $ assets       | ||||
| $  cash        | ||||
| $  checking    | ||||
| $  saving | ||||
| @ | ||||
| 
 | ||||
| we elide boring accounts in two ways: | ||||
| 
 | ||||
| - leaf accounts and branches with 0 balance or 0 transactions are omitted | ||||
| 
 | ||||
| - inner accounts with 0 transactions and 1 subaccount are displayed inline | ||||
| 
 | ||||
| so this: | ||||
| 
 | ||||
| @ | ||||
| a (0 txns) | ||||
|   b (0 txns) | ||||
|     c | ||||
|       d | ||||
| e (0 txns) | ||||
|   f | ||||
|   g | ||||
| h (0 txns) | ||||
|   i (0 balance) | ||||
| @ | ||||
| 
 | ||||
| is displayed like: | ||||
| 
 | ||||
| @ | ||||
| a:b:c | ||||
|   d | ||||
| e | ||||
|   f | ||||
|   g | ||||
| @ | ||||
| -} | ||||
| showLedgerAccounts :: Ledger -> Int -> String | ||||
| showLedgerAccounts l maxdepth =  | ||||
|     concatMap  | ||||
|  | ||||
| @ -8,18 +8,23 @@ import Amount | ||||
| 
 | ||||
| instance Show LedgerEntry where show = showEntryDescription | ||||
| 
 | ||||
| -- | for register report | ||||
| -- | ||||
| -- a register entry is displayed as two or more lines like this: | ||||
| -- date       description          account                 amount       balance | ||||
| -- DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaaaaa  AAAAAAAAAAA AAAAAAAAAAAA | ||||
| --                                 aaaaaaaaaaaaaaaaaaaaaa  AAAAAAAAAAA AAAAAAAAAAAA | ||||
| --                                 ...                     ...         ... | ||||
| -- datewidth = 10 | ||||
| -- descwidth = 20 | ||||
| -- acctwidth = 22 | ||||
| -- amtwidth  = 11 | ||||
| -- balwidth  = 12 | ||||
| {- | ||||
| Helpers for the register report. A register entry is displayed as two | ||||
| or more lines like this: | ||||
| 
 | ||||
| @ | ||||
| date       description          account                 amount       balance | ||||
| DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaaaaa  AAAAAAAAAAA AAAAAAAAAAAA | ||||
|                                 aaaaaaaaaaaaaaaaaaaaaa  AAAAAAAAAAA AAAAAAAAAAAA | ||||
|                                 ...                     ...         ... | ||||
| 
 | ||||
| datewidth = 10 | ||||
| descwidth = 20 | ||||
| acctwidth = 22 | ||||
| amtwidth  = 11 | ||||
| balwidth  = 12 | ||||
| @ | ||||
| -} | ||||
| 
 | ||||
| showEntryDescription e = (showDate $ edate e) ++ " " ++ (showDescription $ edescription e) ++ " " | ||||
| showDate d = printf "%-10s" d | ||||
| @ -36,18 +41,22 @@ autofillEntry e@(LedgerEntry _ _ _ _ _ ts _) = | ||||
|       True -> e' | ||||
|       False -> (error $ "transactions don't balance in " ++ show e) | ||||
| 
 | ||||
| -- | the print command shows cleaned up ledger file entries, something like: | ||||
| -- | ||||
| -- yyyy/mm/dd[ *][ CODE] description.........          [  ; comment...............] | ||||
| --     account name 1.....................  ...$amount1[  ; comment...............] | ||||
| --     account name 2.....................  ..$-amount1[  ; comment...............] | ||||
| -- | ||||
| -- pcodewidth    = no limit -- 10 | ||||
| -- pdescwidth    = no limit -- 20 | ||||
| -- pacctwidth    = 35 minimum, no maximum | ||||
| -- pamtwidth     = 11 | ||||
| -- pcommentwidth = no limit -- 22 | ||||
| {-| | ||||
| Helper for the print command which shows cleaned up ledger file | ||||
| entries, something like: | ||||
| 
 | ||||
| @ | ||||
| yyyy/mm/dd[ *][ CODE] description.........          [  ; comment...............] | ||||
|     account name 1.....................  ...$amount1[  ; comment...............] | ||||
|     account name 2.....................  ..$-amount1[  ; comment...............] | ||||
| 
 | ||||
| pcodewidth    = no limit -- 10 | ||||
| pdescwidth    = no limit -- 20 | ||||
| pacctwidth    = 35 minimum, no maximum | ||||
| pamtwidth     = 11 | ||||
| pcommentwidth = no limit -- 22 | ||||
| @ | ||||
| -} | ||||
| showEntry :: LedgerEntry -> String | ||||
| showEntry e =  | ||||
|     unlines $ [precedingcomment ++ description] ++ (showtxns $ etransactions e) ++ [""] | ||||
|  | ||||
							
								
								
									
										47
									
								
								Types.hs
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								Types.hs
									
									
									
									
									
								
							| @ -1,35 +1,11 @@ | ||||
| {-|  | ||||
| All the basic data types, defined here for easy re-use. See "Main". | ||||
| -} | ||||
| module Types  | ||||
| where | ||||
| import Utils | ||||
| import qualified Data.Map as Map | ||||
| 
 | ||||
| {- | ||||
| Here is the approximate module hierarchy. The early code defined types in | ||||
| each module and so was strictly layered. Now, all data types have been | ||||
| moved to the bottom. The modules are still used to group related | ||||
| functions/methods (" make overview " to list those). | ||||
| 
 | ||||
| hledger | ||||
|  Options | ||||
|  Tests | ||||
|   Parse | ||||
|    Models | ||||
|     TimeLog | ||||
|      TimeLogEntry | ||||
|     Ledger | ||||
|      Account | ||||
|       Transaction | ||||
|      LedgerFile | ||||
|       LedgerEntry | ||||
|        LedgerTransaction | ||||
|         AccountName | ||||
|         Amount | ||||
|          Currency | ||||
|           Types | ||||
|            Utils | ||||
| 
 | ||||
| -} | ||||
| 
 | ||||
| -- | account and description-matching patterns | ||||
| type FilterPatterns = (Maybe Regex, Maybe Regex) | ||||
|                         | ||||
| @ -42,14 +18,14 @@ data Currency = Currency { | ||||
|       rate :: Double -- relative to the dollar.. 0 rates not supported yet | ||||
|     } deriving (Eq,Show) | ||||
| 
 | ||||
| -- | some amount of money, time, stock, oranges, etc. | ||||
| -- | some amount of money, time, stock, oranges, or whatever. | ||||
| data Amount = Amount { | ||||
|       currency :: Currency, | ||||
|       quantity :: Double, | ||||
|       precision :: Int -- ^ number of significant decimal places | ||||
|       precision :: Int -- number of significant decimal places | ||||
|     } deriving (Eq) | ||||
| 
 | ||||
| -- AccountNames are strings like "assets:cash:petty", from which we derive | ||||
| -- | AccountNames are strings like assets:cash:petty, from which we derive | ||||
| -- the chart of accounts | ||||
| type AccountName = String | ||||
| 
 | ||||
| @ -60,7 +36,7 @@ data LedgerTransaction = LedgerTransaction { | ||||
|       tcomment :: String | ||||
|     } deriving (Eq) | ||||
| 
 | ||||
| -- | a ledger entry, with two or more balanced transactions | ||||
| -- | a ledger entry, containing two or more balanced transactions | ||||
| data LedgerEntry = LedgerEntry { | ||||
|       edate :: Date, | ||||
|       estatus :: Bool, | ||||
| @ -83,13 +59,14 @@ data PeriodicEntry = PeriodicEntry { | ||||
|       p_transactions :: [LedgerTransaction] | ||||
|     } deriving (Eq) | ||||
| 
 | ||||
| -- | we also parse timeclock.el timelogs | ||||
| -- | a timelog entry (we also parse timeclock.el timelogs) | ||||
| data TimeLogEntry = TimeLogEntry { | ||||
|       tlcode :: Char, | ||||
|       tldatetime :: DateTime, | ||||
|       tlcomment :: String | ||||
|     } deriving (Eq,Ord) | ||||
| 
 | ||||
| -- | a parsed timelog file | ||||
| data TimeLog = TimeLog { | ||||
|       timelog_entries :: [TimeLogEntry] | ||||
|     } deriving (Eq) | ||||
| @ -114,9 +91,9 @@ data Transaction = Transaction { | ||||
| 
 | ||||
| -- | cached information for a particular account | ||||
| data Account = Account { | ||||
|       aname :: AccountName,  | ||||
|       atransactions :: [Transaction], -- ^ excludes sub-accounts | ||||
|       abalance :: Amount              -- ^ includes sub-accounts | ||||
|       aname :: AccountName,           -- ^ the account name | ||||
|       atransactions :: [Transaction], -- ^ the transactions, excluding sub-accounts | ||||
|       abalance :: Amount              -- ^ the total balance, including sub-accounts | ||||
|     } | ||||
| 
 | ||||
| -- | a ledger with account information cached for faster queries | ||||
|  | ||||
							
								
								
									
										34
									
								
								hledger.hs
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								hledger.hs
									
									
									
									
									
								
							| @ -6,11 +6,37 @@ Copyright (c) 2007-2008 Simon Michael <simon@joyful.com> | ||||
| Released under GPL version 3 or later. | ||||
| 
 | ||||
| This is a minimal haskell clone of John Wiegley's ledger | ||||
| <http://newartisans.com/software/ledger.html>.  hledger does basic | ||||
| register & balance reports, and demonstrates a (naive) purely | ||||
| functional implementation of ledger. | ||||
| <http://newartisans.com/software/ledger.html>.  hledger generates | ||||
| simple ledger-compatible register & balance reports from a standard | ||||
| ledger file, and demonstrates a (naive) purely functional | ||||
| implementation of ledger. | ||||
| 
 | ||||
| See the "Types" module for a code overview. | ||||
| Code overview:  | ||||
| 
 | ||||
| The early code defined types in each module and so was very strictly | ||||
| layered. Since then, all data types have been moved to "Types" at the | ||||
| bottom, but the original modules are still used to group related | ||||
| functions/methods. Here is the approximate module hierarchy: | ||||
| 
 | ||||
| @ | ||||
| hledger ("Main") | ||||
|  "Options" | ||||
|  "Tests" | ||||
|   "Parse" | ||||
|    "Models" | ||||
|     "TimeLog" | ||||
|     "Ledger" | ||||
|      "Account" | ||||
|       "Transaction" | ||||
|      "LedgerFile" | ||||
|       "LedgerEntry" | ||||
|        "LedgerTransaction" | ||||
|         "AccountName" | ||||
|         "Amount" | ||||
|          "Currency" | ||||
|           "Types" | ||||
|            "Utils" | ||||
| @ | ||||
| -} | ||||
| 
 | ||||
| module Main | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user