;lib: move PriceGraph, PriceOracle, ValuationType to Valuation.hs
This commit is contained in:
		
							parent
							
								
									1cbbe8f43d
								
							
						
					
					
						commit
						62e96b1b20
					
				@ -27,7 +27,6 @@ import Data.Data
 | 
				
			|||||||
import Data.Decimal
 | 
					import Data.Decimal
 | 
				
			||||||
import Data.Default
 | 
					import Data.Default
 | 
				
			||||||
import Data.Functor (($>))
 | 
					import Data.Functor (($>))
 | 
				
			||||||
import Data.Graph.Inductive (Gr,Node,NodeMap)
 | 
					 | 
				
			||||||
import Data.List (intercalate)
 | 
					import Data.List (intercalate)
 | 
				
			||||||
import Text.Blaze (ToMarkup(..))
 | 
					import Text.Blaze (ToMarkup(..))
 | 
				
			||||||
--XXX https://hackage.haskell.org/package/containers/docs/Data-Map.html
 | 
					--XXX https://hackage.haskell.org/package/containers/docs/Data-Map.html
 | 
				
			||||||
@ -446,42 +445,7 @@ data MarketPrice = MarketPrice {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
instance NFData MarketPrice
 | 
					instance NFData MarketPrice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | A snapshot of the known exchange rates between commodity pairs at a given date,
 | 
					-- additional valuation-related types in Valuation.hs
 | 
				
			||||||
-- as a graph allowing fast lookup and path finding, along with some helper data.
 | 
					 | 
				
			||||||
data PriceGraph = PriceGraph {
 | 
					 | 
				
			||||||
   prGraph   :: Gr CommoditySymbol Quantity
 | 
					 | 
				
			||||||
    -- ^ A directed graph of exchange rates between commodity pairs.
 | 
					 | 
				
			||||||
    -- Node labels are commodities and edge labels are exchange rates,
 | 
					 | 
				
			||||||
    -- either explicitly declared (preferred) or inferred by reversing a declared rate.
 | 
					 | 
				
			||||||
    -- There will be at most one edge between each directed pair of commodities,
 | 
					 | 
				
			||||||
    -- eg there can be one USD->EUR and one EUR->USD.
 | 
					 | 
				
			||||||
  ,prNodemap :: NodeMap CommoditySymbol
 | 
					 | 
				
			||||||
    -- ^ Mapping of graph node ids to commodity symbols.
 | 
					 | 
				
			||||||
  ,prDeclaredPairs :: [(Node,Node)]
 | 
					 | 
				
			||||||
    -- ^ Which of the edges in this graph are declared rates,
 | 
					 | 
				
			||||||
    --   rather than inferred reverse rates.
 | 
					 | 
				
			||||||
    --   A bit ugly. We could encode this in the edges,
 | 
					 | 
				
			||||||
    --   but those have to be Real for shortest path finding,
 | 
					 | 
				
			||||||
    --   so we'd have to transform them all first.
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  deriving (Show,Generic)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
instance NFData PriceGraph
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- | A price oracle is a magic function that looks up market prices
 | 
					 | 
				
			||||||
-- (exchange rates) from one commodity to another (or if unspecified,
 | 
					 | 
				
			||||||
-- to a default valuation commodity) on a given date, somewhat efficiently.
 | 
					 | 
				
			||||||
type PriceOracle = (Day, CommoditySymbol, Maybe CommoditySymbol) -> Maybe (CommoditySymbol, Quantity)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- | What kind of value conversion should be done on amounts ?
 | 
					 | 
				
			||||||
-- UI: --value=cost|end|now|DATE[,COMM]
 | 
					 | 
				
			||||||
data ValuationType =
 | 
					 | 
				
			||||||
    AtCost     (Maybe CommoditySymbol)  -- ^ convert to cost commodity using transaction prices, then optionally to given commodity using market prices at posting date
 | 
					 | 
				
			||||||
  | AtEnd      (Maybe CommoditySymbol)  -- ^ convert to default valuation commodity or given commodity, using market prices at period end(s)
 | 
					 | 
				
			||||||
  | AtNow      (Maybe CommoditySymbol)  -- ^ convert to default valuation commodity or given commodity, using current market prices
 | 
					 | 
				
			||||||
  | AtDate Day (Maybe CommoditySymbol)  -- ^ convert to default valuation commodity or given commodity, using market prices on some date
 | 
					 | 
				
			||||||
  | AtDefault  (Maybe CommoditySymbol)  -- ^ works like AtNow in single period reports, like AtEnd in multiperiod reports
 | 
					 | 
				
			||||||
  deriving (Show,Data,Eq) -- Typeable
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | A Journal, containing transactions and various other things.
 | 
					-- | A Journal, containing transactions and various other things.
 | 
				
			||||||
-- The basic data model for hledger.
 | 
					-- The basic data model for hledger.
 | 
				
			||||||
 | 
				
			|||||||
@ -9,9 +9,12 @@ looking up historical market prices (exchange rates) between commodities.
 | 
				
			|||||||
{-# LANGUAGE OverloadedStrings #-}
 | 
					{-# LANGUAGE OverloadedStrings #-}
 | 
				
			||||||
{-# LANGUAGE RecordWildCards #-}
 | 
					{-# LANGUAGE RecordWildCards #-}
 | 
				
			||||||
{-# LANGUAGE ScopedTypeVariables #-}
 | 
					{-# LANGUAGE ScopedTypeVariables #-}
 | 
				
			||||||
 | 
					{-# LANGUAGE DeriveDataTypeable, DeriveGeneric #-}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module Hledger.Data.Valuation (
 | 
					module Hledger.Data.Valuation (
 | 
				
			||||||
   journalPriceOracle
 | 
					   ValuationType(..)
 | 
				
			||||||
 | 
					  ,PriceOracle
 | 
				
			||||||
 | 
					  ,journalPriceOracle
 | 
				
			||||||
  -- ,amountValueAtDate
 | 
					  -- ,amountValueAtDate
 | 
				
			||||||
  -- ,amountApplyValuation
 | 
					  -- ,amountApplyValuation
 | 
				
			||||||
  ,mixedAmountValueAtDate
 | 
					  ,mixedAmountValueAtDate
 | 
				
			||||||
@ -24,6 +27,8 @@ module Hledger.Data.Valuation (
 | 
				
			|||||||
where
 | 
					where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Control.Applicative ((<|>))
 | 
					import Control.Applicative ((<|>))
 | 
				
			||||||
 | 
					import Control.DeepSeq (NFData)
 | 
				
			||||||
 | 
					import Data.Data
 | 
				
			||||||
import Data.Decimal (roundTo)
 | 
					import Data.Decimal (roundTo)
 | 
				
			||||||
import Data.Function (on)
 | 
					import Data.Function (on)
 | 
				
			||||||
import Data.Graph.Inductive  (Gr, Node, NodeMap, mkMapGraph, mkNode, lab, out, sp)
 | 
					import Data.Graph.Inductive  (Gr, Node, NodeMap, mkMapGraph, mkNode, lab, out, sp)
 | 
				
			||||||
@ -34,6 +39,7 @@ import Data.Maybe
 | 
				
			|||||||
import qualified Data.Text as T
 | 
					import qualified Data.Text as T
 | 
				
			||||||
import Data.Time.Calendar (Day)
 | 
					import Data.Time.Calendar (Day)
 | 
				
			||||||
import Data.MemoUgly (memo)
 | 
					import Data.MemoUgly (memo)
 | 
				
			||||||
 | 
					import GHC.Generics (Generic)
 | 
				
			||||||
import Safe (headMay)
 | 
					import Safe (headMay)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Hledger.Utils
 | 
					import Hledger.Utils
 | 
				
			||||||
@ -47,6 +53,46 @@ tests_Valuation = tests "Valuation" [
 | 
				
			|||||||
  ]
 | 
					  ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					-- Types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- | A snapshot of the known exchange rates between commodity pairs at a given date,
 | 
				
			||||||
 | 
					-- as a graph allowing fast lookup and path finding, along with some helper data.
 | 
				
			||||||
 | 
					data PriceGraph = PriceGraph {
 | 
				
			||||||
 | 
					   prGraph   :: Gr CommoditySymbol Quantity
 | 
				
			||||||
 | 
					    -- ^ A directed graph of exchange rates between commodity pairs.
 | 
				
			||||||
 | 
					    -- Node labels are commodities and edge labels are exchange rates,
 | 
				
			||||||
 | 
					    -- either explicitly declared (preferred) or inferred by reversing a declared rate.
 | 
				
			||||||
 | 
					    -- There will be at most one edge between each directed pair of commodities,
 | 
				
			||||||
 | 
					    -- eg there can be one USD->EUR and one EUR->USD.
 | 
				
			||||||
 | 
					  ,prNodemap :: NodeMap CommoditySymbol
 | 
				
			||||||
 | 
					    -- ^ Mapping of graph node ids to commodity symbols.
 | 
				
			||||||
 | 
					  ,prDeclaredPairs :: [(Node,Node)]
 | 
				
			||||||
 | 
					    -- ^ Which of the edges in this graph are declared rates,
 | 
				
			||||||
 | 
					    --   rather than inferred reverse rates.
 | 
				
			||||||
 | 
					    --   A bit ugly. We could encode this in the edges,
 | 
				
			||||||
 | 
					    --   but those have to be Real for shortest path finding,
 | 
				
			||||||
 | 
					    --   so we'd have to transform them all first.
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  deriving (Show,Generic)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instance NFData PriceGraph
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- | A price oracle is a magic function that looks up market prices
 | 
				
			||||||
 | 
					-- (exchange rates) from one commodity to another (or if unspecified,
 | 
				
			||||||
 | 
					-- to a default valuation commodity) on a given date, somewhat efficiently.
 | 
				
			||||||
 | 
					type PriceOracle = (Day, CommoditySymbol, Maybe CommoditySymbol) -> Maybe (CommoditySymbol, Quantity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- | What kind of value conversion should be done on amounts ?
 | 
				
			||||||
 | 
					-- UI: --value=cost|end|now|DATE[,COMM]
 | 
				
			||||||
 | 
					data ValuationType =
 | 
				
			||||||
 | 
					    AtCost     (Maybe CommoditySymbol)  -- ^ convert to cost commodity using transaction prices, then optionally to given commodity using market prices at posting date
 | 
				
			||||||
 | 
					  | AtEnd      (Maybe CommoditySymbol)  -- ^ convert to default valuation commodity or given commodity, using market prices at period end(s)
 | 
				
			||||||
 | 
					  | AtNow      (Maybe CommoditySymbol)  -- ^ convert to default valuation commodity or given commodity, using current market prices
 | 
				
			||||||
 | 
					  | AtDate Day (Maybe CommoditySymbol)  -- ^ convert to default valuation commodity or given commodity, using market prices on some date
 | 
				
			||||||
 | 
					  | AtDefault  (Maybe CommoditySymbol)  -- ^ works like AtNow in single period reports, like AtEnd in multiperiod reports
 | 
				
			||||||
 | 
					  deriving (Show,Data,Eq) -- Typeable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
------------------------------------------------------------------------------
 | 
					------------------------------------------------------------------------------
 | 
				
			||||||
-- Valuation
 | 
					-- Valuation
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user