module Hcompta.Model.Amount.Style where
import Data.Data
+import Data.Word (Word8)
import Data.Typeable ()
-data T
- = T
- { commodity_side :: Maybe Side
- , commodity_spaced :: Maybe Bool
- , precision :: Int
- , decimal_point :: Maybe Char
- , digit_group :: Maybe DigitGroup
+-- * The 'Style' type
+
+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)
-data Side
- = L
- | R
+type Fractioning
+ = Char
+
+data Grouping
+ = Grouping Char [Int]
deriving (Data, Eq, Ord, Read, Show, Typeable)
-data DigitGroup
- = DigitGroup Char [Int]
+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
+ }