{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Hcompta.Amount where import Data.Data (Data) import Data.Eq (Eq(..)) import Data.Functor (Functor(..)) import Data.Ord (Ord(..), Ordering) import Data.Tuple (fst, snd) import Prelude (($), (.)) import Hcompta.Polarize 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 ( 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 instance ( Polarizable quantity ) => Polarizable (unit, quantity) where polarizable_positive (u, q) = fmap (u,) $ polarizable_positive q polarizable_negative (u, q) = fmap (u,) $ polarizable_negative q amount_sign :: ( Amount a , Ord (Amount_Quantity a) ) => a -> Ordering amount_sign = quantity_sign . amount_quantity