From 17d5acf64badc1a8f16ae3b8698cdf134850165f Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Mon, 15 Nov 2010 07:18:35 +0000 Subject: [PATCH] refactor: more reader cleanups --- hledger-lib/Hledger/Data/Types.hs | 17 ++++++++++++-- hledger-lib/Hledger/Read.hs | 3 +-- hledger-lib/Hledger/Read/JournalReader.hs | 17 +++++--------- hledger-lib/Hledger/Read/TimelogReader.hs | 4 ++-- .../Hledger/Read/{Common.hs => Utils.hs} | 22 +++++-------------- 5 files changed, 28 insertions(+), 35 deletions(-) rename hledger-lib/Hledger/Read/{Common.hs => Utils.hs} (81%) diff --git a/hledger-lib/Hledger/Data/Types.hs b/hledger-lib/Hledger/Data/Types.hs index 0520114fa..2f0e14f94 100644 --- a/hledger-lib/Hledger/Data/Types.hs +++ b/hledger-lib/Hledger/Data/Types.hs @@ -32,10 +32,12 @@ Evolution of transaction\/entry\/posting terminology: module Hledger.Data.Types where -import Hledger.Data.Utils +import Control.Monad.Error (ErrorT) +import Data.Typeable (Typeable) import qualified Data.Map as Map import System.Time (ClockTime) -import Data.Typeable (Typeable) + +import Hledger.Data.Utils type SmartDate = (String,String,String) @@ -148,6 +150,17 @@ data Journal = Journal { filereadtime :: ClockTime -- ^ when this journal was last read from its file(s) } deriving (Eq, Typeable) +-- | A JournalUpdate is some transformation of a Journal. It can do I/O or +-- raise an error. +type JournalUpdate = ErrorT String IO (Journal -> Journal) + +-- | A hledger journal reader is a triple of format name, format-detecting +-- predicate, and a parser to Journal. +data Reader = Reader {rFormat :: String + ,rDetector :: FilePath -> String -> Bool + ,rParser :: FilePath -> String -> ErrorT String IO Journal + } + data Ledger = Ledger { journal :: Journal, accountnametree :: Tree AccountName, diff --git a/hledger-lib/Hledger/Read.hs b/hledger-lib/Hledger/Read.hs index 04b452508..5604cbfd5 100644 --- a/hledger-lib/Hledger/Read.hs +++ b/hledger-lib/Hledger/Read.hs @@ -17,10 +17,9 @@ module Hledger.Read ( ) where import Hledger.Data.Dates (getCurrentDay) -import Hledger.Data.Types (Journal(..)) +import Hledger.Data.Types (Journal(..), Reader(..)) import Hledger.Data.Journal (nullctx) import Hledger.Data.Utils -import Hledger.Read.Common import Hledger.Read.JournalReader as JournalReader import Hledger.Read.TimelogReader as TimelogReader diff --git a/hledger-lib/Hledger/Read/JournalReader.hs b/hledger-lib/Hledger/Read/JournalReader.hs index 12eacea27..d0a75a67d 100644 --- a/hledger-lib/Hledger/Read/JournalReader.hs +++ b/hledger-lib/Hledger/Read/JournalReader.hs @@ -124,16 +124,9 @@ import Text.ParserCombinators.Parsec hiding (parse) import Prelude hiding (readFile, putStr, putStrLn, print, getContents) import System.IO.UTF8 #endif -import Hledger.Data.Utils -import Hledger.Data.Types -import Hledger.Data.Dates -import Hledger.Data.AccountName (accountNameFromComponents,accountNameComponents) -import Hledger.Data.Amount -import Hledger.Data.Transaction -import Hledger.Data.Posting -import Hledger.Data.Journal -import Hledger.Data.Commodity (dollars,dollar,unknown,nonsimplecommoditychars) -import Hledger.Read.Common + +import Hledger.Data +import Hledger.Read.Utils -- let's get to it @@ -154,8 +147,8 @@ parse :: FilePath -> String -> ErrorT String IO Journal parse = parseJournalWith journalFile -- | Top-level journal parser. Returns a single composite, I/O performing, --- error-raising "JournalUpdate" which can be applied to an empty journal --- to get the final result. +-- error-raising "JournalUpdate" (and final "JournalContext") which can be +-- applied to an empty journal to get the final result. journalFile :: GenParser Char JournalContext (JournalUpdate,JournalContext) journalFile = do journalupdates <- many journalItem diff --git a/hledger-lib/Hledger/Read/TimelogReader.hs b/hledger-lib/Hledger/Read/TimelogReader.hs index b1436f384..4883044c1 100644 --- a/hledger-lib/Hledger/Read/TimelogReader.hs +++ b/hledger-lib/Hledger/Read/TimelogReader.hs @@ -50,9 +50,9 @@ where import Control.Monad.Error (ErrorT(..)) import Text.ParserCombinators.Parsec hiding (parse) import Hledger.Data -import Hledger.Read.Common +import Hledger.Read.Utils import Hledger.Read.JournalReader (ledgerExclamationDirective, ledgerHistoricalPrice, - ledgerDefaultYear, emptyLine, ledgerdatetime) + ledgerDefaultYear, emptyLine, ledgerdatetime) reader :: Reader diff --git a/hledger-lib/Hledger/Read/Common.hs b/hledger-lib/Hledger/Read/Utils.hs similarity index 81% rename from hledger-lib/Hledger/Read/Common.hs rename to hledger-lib/Hledger/Read/Utils.hs index 936429e9a..a8dc67d30 100644 --- a/hledger-lib/Hledger/Read/Common.hs +++ b/hledger-lib/Hledger/Read/Utils.hs @@ -1,32 +1,20 @@ {-| - -Common utilities for hledger data readers, such as the context (state) -that is kept while parsing a journal. - +Utilities common to hledger journal readers. -} -module Hledger.Read.Common +module Hledger.Read.Utils where import Control.Monad.Error -import Hledger.Data.Utils -import Hledger.Data.Types (Journal, JournalContext(..), Commodity) -import Hledger.Data.Journal import System.Directory (getHomeDirectory) import System.FilePath(takeDirectory,combine) import System.Time (getClockTime) import Text.ParserCombinators.Parsec +import Hledger.Data.Types (Journal, JournalContext(..), Commodity, JournalUpdate) +import Hledger.Data.Utils +import Hledger.Data.Journal (nullctx, nulljournal, journalFinalise) --- | A hledger data reader is a triple of format name, format-detecting predicate, and a parser to Journal. -data Reader = Reader {rFormat :: String - ,rDetector :: FilePath -> String -> Bool - ,rParser :: FilePath -> String -> ErrorT String IO Journal - } - --- | A JournalUpdate is some transformation of a "Journal". It can do I/O --- or raise an error. -type JournalUpdate = ErrorT String IO (Journal -> Journal) juSequence :: [JournalUpdate] -> JournalUpdate juSequence us = liftM (foldr (.) id) $ sequence us