{-# LANGUAGE DeriveDataTypeable #-} module Hcompta.Amount.Style where import Data.Data import Data.Word (Word8) import Data.Typeable () -- * Type 'Style' data Style = Style { fractioning :: Maybe Fractioning , grouping_integral :: Maybe Grouping , grouping_fractional :: Maybe Grouping , precision :: Precision -- TODO: , sign_plus :: Maybe Bool , unit_side :: Maybe Side , unit_spaced :: Maybe Spacing } deriving (Data, Eq, Ord, Read, Show, Typeable) type Fractioning = Char data Grouping = Grouping Char [Int] deriving (Data, Eq, Ord, Read, Show, Typeable) type Precision = Word8 type Spacing = Bool data Side = Side_Left | Side_Right deriving (Data, Eq, Ord, Read, Show, Typeable) -- * Constructors nil :: Style nil = Style { fractioning = Nothing , grouping_integral = Nothing , grouping_fractional = Nothing , precision = 0 , unit_side = Nothing , unit_spaced = Nothing } -- * Operators union :: Style -> Style -> Style union style@Style { fractioning=fractioning_ , grouping_integral=grouping_integral_ , grouping_fractional=grouping_fractional_ , precision=precision_ , unit_side=side , unit_spaced=spaced } style'@Style { fractioning=fractioning' , grouping_integral=grouping_integral_' , grouping_fractional=grouping_fractional_' , precision=precision' , unit_side=side' , unit_spaced=spaced' } = if style == style' then style' else Style { fractioning=maybe fractioning' (const fractioning_) fractioning_ , grouping_integral=maybe grouping_integral_' (const grouping_integral_) grouping_integral_ , grouping_fractional=maybe grouping_fractional_' (const grouping_fractional_) grouping_fractional_ , precision=max precision_ precision' , unit_side=maybe side' (const side) side , unit_spaced=maybe spaced' (const spaced) spaced }