{-# 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
		 }