diff --git a/hledger-lib/Hledger/Data/Types.hs b/hledger-lib/Hledger/Data/Types.hs index cb2b8d180..7e845cd72 100644 --- a/hledger-lib/Hledger/Data/Types.hs +++ b/hledger-lib/Hledger/Data/Types.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE CPP, DeriveDataTypeable, StandaloneDeriving, DeriveAnyClass, DeriveGeneric, TypeSynonymInstances, FlexibleInstances #-} +{-# LANGUAGE CPP, DeriveDataTypeable, StandaloneDeriving, DeriveGeneric, TypeSynonymInstances, FlexibleInstances #-} {-| Most data types are defined here to avoid import cycles. @@ -39,21 +39,29 @@ type SmartDate = (String,String,String) data WhichDate = PrimaryDate | SecondaryDate deriving (Eq,Show) -data DateSpan = DateSpan (Maybe Day) (Maybe Day) deriving (Eq,Ord,Data,NFData,Generic,Typeable) +data DateSpan = DateSpan (Maybe Day) (Maybe Day) deriving (Eq,Ord,Data,Generic,Typeable) + +instance NFData DateSpan data Interval = NoInterval | Days Int | Weeks Int | Months Int | Quarters Int | Years Int | DayOfMonth Int | DayOfWeek Int -- WeekOfYear Int | MonthOfYear Int | QuarterOfYear Int - deriving (Eq,Show,Ord,Data,NFData,Generic,Typeable) + deriving (Eq,Show,Ord,Data,Generic,Typeable) + +instance NFData Interval type AccountName = String data AccountAlias = BasicAlias AccountName AccountName | RegexAlias Regexp Replacement - deriving (Eq, Read, Show, Ord, Data, NFData,Generic, Typeable) + deriving (Eq, Read, Show, Ord, Data, Generic, Typeable) -data Side = L | R deriving (Eq,Show,Read,Ord,Typeable,Data,NFData,Generic) +instance NFData AccountAlias + +data Side = L | R deriving (Eq,Show,Read,Ord,Typeable,Data,Generic) + +instance NFData Side type Commodity = String @@ -76,7 +84,9 @@ numberRepresentation = "Decimal" -- | An amount's price (none, per unit, or total) in another commodity. -- Note the price should be a positive number, although this is not enforced. -data Price = NoPrice | UnitPrice Amount | TotalPrice Amount deriving (Eq,Ord,Typeable,Data,NFData,Generic) +data Price = NoPrice | UnitPrice Amount | TotalPrice Amount deriving (Eq,Ord,Typeable,Data,Generic) + +instance NFData Price -- | Display style for an amount. data AmountStyle = AmountStyle { @@ -85,7 +95,9 @@ data AmountStyle = AmountStyle { asprecision :: Int, -- ^ number of digits displayed after the decimal point asdecimalpoint :: Maybe Char, -- ^ character used as decimal point: period or comma. Nothing means "unspecified, use default" asdigitgroups :: Maybe DigitGroupStyle -- ^ style for displaying digit groups, if any -} deriving (Eq,Ord,Read,Show,Typeable,Data,NFData,Generic) +} deriving (Eq,Ord,Read,Show,Typeable,Data,Generic) + +instance NFData AmountStyle -- | A style for displaying digit groups in the integer part of a -- floating point number. It consists of the character used to @@ -94,24 +106,34 @@ data AmountStyle = AmountStyle { -- the decimal point. The last group size is assumed to repeat. Eg, -- comma between thousands is DigitGroups ',' [3]. data DigitGroupStyle = DigitGroups Char [Int] - deriving (Eq,Ord,Read,Show,Typeable,Data,NFData,Generic) + deriving (Eq,Ord,Read,Show,Typeable,Data,Generic) + +instance NFData DigitGroupStyle data Amount = Amount { acommodity :: Commodity, aquantity :: Quantity, aprice :: Price, -- ^ the (fixed) price for this amount, if any astyle :: AmountStyle - } deriving (Eq,Ord,Typeable,Data,NFData,Generic) + } deriving (Eq,Ord,Typeable,Data,Generic) -newtype MixedAmount = Mixed [Amount] deriving (Eq,Ord,Typeable,Data,NFData,Generic) +instance NFData Amount + +newtype MixedAmount = Mixed [Amount] deriving (Eq,Ord,Typeable,Data,Generic) + +instance NFData MixedAmount data PostingType = RegularPosting | VirtualPosting | BalancedVirtualPosting - deriving (Eq,Show,Typeable,Data,NFData,Generic) + deriving (Eq,Show,Typeable,Data,Generic) + +instance NFData PostingType type Tag = (String, String) -- ^ A tag name and (possibly empty) value. data ClearedStatus = Uncleared | Pending | Cleared - deriving (Eq,Ord,Typeable,Data,NFData,Generic) + deriving (Eq,Ord,Typeable,Data,Generic) + +instance NFData ClearedStatus instance Show ClearedStatus where -- custom show show Uncleared = "" -- a bad idea @@ -130,7 +152,9 @@ data Posting = Posting { pbalanceassertion :: Maybe MixedAmount, -- ^ optional: the expected balance in the account after this posting ptransaction :: Maybe Transaction -- ^ this posting's parent transaction (co-recursive types). -- Tying this knot gets tedious, Maybe makes it easier/optional. - } deriving (Typeable,Data,NFData,Generic) + } deriving (Typeable,Data,Generic) + +instance NFData Posting -- The equality test for postings ignores the parent transaction's -- identity, to avoid infinite loops. @@ -140,7 +164,9 @@ instance Eq Posting where -- | The position of parse errors (eg), like parsec's SourcePos but generic. -- File name, 1-based line number and 1-based column number. data GenericSourcePos = GenericSourcePos FilePath Int Int - deriving (Eq, Read, Show, Ord, Data, NFData, Generic, Typeable) + deriving (Eq, Read, Show, Ord, Data, Generic, Typeable) + +instance NFData GenericSourcePos data Transaction = Transaction { tsourcepos :: GenericSourcePos, @@ -153,19 +179,27 @@ data Transaction = Transaction { ttags :: [Tag], -- ^ tag names and values, extracted from the comment tpostings :: [Posting], -- ^ this transaction's postings tpreceding_comment_lines :: String -- ^ any comment lines immediately preceding this transaction - } deriving (Eq,Typeable,Data,NFData,Generic) + } deriving (Eq,Typeable,Data,Generic) + +instance NFData Transaction data ModifierTransaction = ModifierTransaction { mtvalueexpr :: String, mtpostings :: [Posting] - } deriving (Eq,Typeable,Data,NFData,Generic) + } deriving (Eq,Typeable,Data,Generic) + +instance NFData ModifierTransaction data PeriodicTransaction = PeriodicTransaction { ptperiodicexpr :: String, ptpostings :: [Posting] - } deriving (Eq,Typeable,Data,NFData,Generic) + } deriving (Eq,Typeable,Data,Generic) -data TimeLogCode = SetBalance | SetRequiredHours | In | Out | FinalOut deriving (Eq,Ord,Typeable,Data,NFData,Generic) +instance NFData PeriodicTransaction + +data TimeLogCode = SetBalance | SetRequiredHours | In | Out | FinalOut deriving (Eq,Ord,Typeable,Data,Generic) + +instance NFData TimeLogCode data TimeLogEntry = TimeLogEntry { tlsourcepos :: GenericSourcePos, @@ -173,13 +207,17 @@ data TimeLogEntry = TimeLogEntry { tldatetime :: LocalTime, tlaccount :: String, tldescription :: String - } deriving (Eq,Ord,Typeable,Data,NFData,Generic) + } deriving (Eq,Ord,Typeable,Data,Generic) + +instance NFData TimeLogEntry data HistoricalPrice = HistoricalPrice { hdate :: Day, hcommodity :: Commodity, hamount :: Amount - } deriving (Eq,Typeable,Data, NFData,Generic) -- & Show (in Amount.hs) + } deriving (Eq,Typeable,Data,Generic) -- & Show (in Amount.hs) + +instance NFData HistoricalPrice type Year = Integer @@ -194,13 +232,16 @@ data JournalContext = Ctx { -- specified with "account" directive(s). Concatenated, these -- are the account prefix prepended to parsed account names. , ctxAliases :: ![AccountAlias] -- ^ the current list of account name aliases in effect - } deriving (Read, Show, Eq, Data, Typeable, NFData,Generic) + } deriving (Read, Show, Eq, Data, Typeable, Generic) + +instance NFData JournalContext deriving instance Data (ClockTime) deriving instance Typeable (ClockTime) -deriving instance NFData (ClockTime) deriving instance Generic (ClockTime) +instance NFData ClockTime + data Journal = Journal { jmodifiertxns :: [ModifierTransaction], jperiodictxns :: [PeriodicTransaction], @@ -215,7 +256,9 @@ data Journal = Journal { -- order encountered. filereadtime :: ClockTime, -- ^ when this journal was last read from its file(s) jcommoditystyles :: M.Map Commodity AmountStyle -- ^ how to display amounts in each commodity - } deriving (Eq, Typeable, Data, NFData,Generic) + } deriving (Eq, Typeable, Data, Generic) + +instance NFData Journal -- | A JournalUpdate is some transformation of a Journal. It can do I/O or -- raise an error. diff --git a/hledger-lib/hledger-lib.cabal b/hledger-lib/hledger-lib.cabal index 770dd9118..0a7ee09dd 100644 --- a/hledger-lib/hledger-lib.cabal +++ b/hledger-lib/hledger-lib.cabal @@ -98,6 +98,7 @@ library ,csv -- ,data-pprint >= 0.2.3 && < 0.3 ,Decimal + ,deepseq ,directory ,filepath ,mtl @@ -135,6 +136,7 @@ test-suite tests , csv -- , data-pprint >= 0.2.3 && < 0.3 , Decimal + , deepseq , directory , filepath , HUnit