{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeFamilies #-} module Hcompta.Amount where import Data.Data (Data) import Data.Eq (Eq(..)) import Data.Function ((.)) import Data.Ord (Ord(..), Ordering) import Data.Tuple (fst, snd) import Hcompta.Quantity import Hcompta.Unit (Unit(..)) -- * Class 'Amount' class ( Data a , Eq (Amount_Quantity a) , Zero (Amount_Quantity a) , Unit (Amount_Unit a) ) => Amount a where type Amount_Quantity a type Amount_Unit a amount_quantity :: a -> Amount_Quantity a amount_unit :: a -> Amount_Unit a instance -- Type (unit, quantity) ( Zero quantity , Eq quantity , Unit unit ) => Amount (unit, quantity) where type Amount_Quantity (unit, quantity) = quantity type Amount_Unit (unit, quantity) = unit amount_quantity = snd amount_unit = fst amount_sign :: ( Amount a , Ord (Amount_Quantity a) ) => a -> Ordering amount_sign = quantity_sign . amount_quantity