{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Hcompta.Format.JCC.Amount where import Control.DeepSeq import Data.Bool import Data.Data import Data.Eq (Eq(..)) -- import qualified Data.Foldable -- import qualified Data.List -- import Data.Map.Strict (Map) import Data.Ord (Ord(..), Ordering(..)) -- import Data.String (IsString) -- import Data.Text (Text) -- import qualified Data.Text as Text import Data.Typeable () import Prelude ((.), seq) -- import Prelude (($), (.), Bounded(..), Int, Num(..), flip, seq, error) import Text.Show (Show(..)) import qualified Hcompta.Amount as Amount import qualified Hcompta.Filter as Filter import qualified Hcompta.Polarize as Polarize import qualified Hcompta.Quantity as Quantity import qualified Hcompta.Unit as Unit import qualified Hcompta.Format.JCC.Amount.Style as Style import Hcompta.Format.JCC.Quantity (Quantity) import Hcompta.Format.JCC.Unit (Unit(..)) -- * Type 'Style' type Style = Style.Style type Styles = Style.Styles type Styled t = Style.Styled t -- * Type 'Amount' data Amount = Amount { amount_unit :: !Unit , amount_quantity :: !Quantity } deriving (Data, Show, Typeable) instance Amount.Amount Amount where type Amount_Quantity Amount = Quantity type Amount_Unit Amount = Unit amount_quantity = amount_quantity amount_unit = amount_unit instance Filter.Amount Amount where type Amount_Quantity Amount = Quantity type Amount_Unit Amount = Unit amount_quantity = Polarize.polarize . amount_quantity amount_unit = amount_unit instance NFData Amount where rnf (Amount q u) = rnf q `seq` rnf u instance Quantity.Zero Amount where quantity_zero = Amount Unit.unit_empty Quantity.quantity_zero quantity_null = (==) Quantity.quantity_zero . amount_quantity amount_style :: Styles -> Amount -> Style amount_style styles = Style.style styles . amount_unit style :: Styles -> Amount -> Styled Amount style styles amt = (amount_style styles amt, amt) sign :: Amount -> Ordering sign a = case amount_quantity a of 0 -> EQ q | q < 0 -> LT _ -> GT -- ** Constructors amount :: Amount amount = Amount { amount_quantity = Quantity.quantity_zero , amount_unit = "" } -- ** Tests -- | Return 'True' if and only if 'Amount'’s 'Quantity' is zero. -- -- NOTE: the 'Amount'’s 'amount_quantity' MUST have been rounded -- at 'Amount'’s 'amount_style'’s 'Style.precision'. null :: Amount -> Bool null = Quantity.quantity_null . amount_quantity