{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
module Data.Tax.ATO.Common
(
TaxTables(..)
, HasTaxableIncome(..)
, medicareLevy
, lowIncomeTaxOffset
, lowIncomeTaxOffset2021
, lamito
, corporateTax
, thresholds'
, marginal'
) where
import Control.Lens (Getter, review, to, view)
import Data.Bifunctor (first)
import Data.Tax
import Data.Tax.ATO.PrivateHealthInsuranceRebate
data TaxTables y a = TaxTables
{ forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttIndividualIncomeTax :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttMedicareLevy :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttMedicareLevySurcharge :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttHelp :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttSfss :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttAdditional :: Tax (Money a) (Money a)
, forall {k} (y :: k) a.
TaxTables y a -> PrivateHealthInsuranceRebateRates a
ttPHIRebateRates :: PrivateHealthInsuranceRebateRates a
}
medicareLevy :: (Fractional a, Ord a) => Money a -> Tax (Money a) (Money a)
medicareLevy :: forall a.
(Fractional a, Ord a) =>
Money a -> Tax (Money a) (Money a)
medicareLevy Money a
l = Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. Ord a => Tax b a -> Tax b a -> Tax b a
lesserOf (Money a -> a -> Tax (Money a) (Money a)
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above Money a
l a
0.1) (a -> Tax (Money a) (Money a)
forall a. Num a => a -> Tax (Money a) (Money a)
flat a
0.02)
lowIncomeTaxOffset :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset =
Money a -> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. Ord a => a -> Tax b a -> Tax b a
limit Money a
forall a. Monoid a => a
mempty
(Money a -> Tax (Money a) (Money a)
forall a b. a -> Tax b a
lump (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money (-a
445)) Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a. Semigroup a => a -> a -> a
<> Money a -> a -> Tax (Money a) (Money a)
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money a
37000) a
0.015)
lowIncomeTaxOffset2021 :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset2021 :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset2021 =
Money a -> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. Ord a => a -> Tax b a -> Tax b a
limit Money a
forall a. Monoid a => a
mempty (Tax (Money a) (Money a) -> Tax (Money a) (Money a))
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. (a -> b) -> a -> b
$
Money a -> Tax (Money a) (Money a)
forall a b. a -> Tax b a
lump (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money (-a
700))
Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a. Semigroup a => a -> a -> a
<> Money a -> a -> Tax (Money a) (Money a)
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money a
37500) a
0.05
Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a. Semigroup a => a -> a -> a
<> Money a -> a -> Tax (Money a) (Money a)
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money a
45000) (-a
0.035)
lamito :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lamito :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lamito = Money a -> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. Ord a => a -> Tax b a -> Tax b a
limit Money a
forall a. Monoid a => a
mempty (Tax (Money a) (Money a) -> Tax (Money a) (Money a))
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. (a -> b) -> a -> b
$
Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a b. Ord a => Tax b a -> Tax b a -> Tax b a
greaterOf (Money a -> Tax (Money a) (Money a)
forall a b. a -> Tax b a
lump (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money (-a
1080)))
( Money a -> Tax (Money a) (Money a)
forall a b. a -> Tax b a
lump (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money (-a
255))
Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a. Semigroup a => a -> a -> a
<> Money a -> a -> Tax (Money a) (Money a)
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money a
37000) (-a
0.075) )
Tax (Money a) (Money a)
-> Tax (Money a) (Money a) -> Tax (Money a) (Money a)
forall a. Semigroup a => a -> a -> a
<> Money a -> a -> Tax (Money a) (Money a)
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money a
90000) a
0.03
corporateTax :: (Fractional a) => Tax (Money a) (Money a)
corporateTax :: forall a. Fractional a => Tax (Money a) (Money a)
corporateTax = a -> Tax (Money a) (Money a)
forall a. Num a => a -> Tax (Money a) (Money a)
flat a
0.3
thresholds', marginal'
:: (Fractional a, Ord a) => [(a, a)] -> Tax (Money a) (Money a)
thresholds' :: forall a.
(Fractional a, Ord a) =>
[(a, a)] -> Tax (Money a) (Money a)
thresholds' = [(Money a, a)] -> Tax (Money a) (Money a)
forall a.
(Fractional a, Ord a) =>
[(Money a, a)] -> Tax (Money a) (Money a)
thresholds ([(Money a, a)] -> Tax (Money a) (Money a))
-> ([(a, a)] -> [(Money a, a)])
-> [(a, a)]
-> Tax (Money a) (Money a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, a) -> (Money a, a)) -> [(a, a)] -> [(Money a, a)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> Money a) -> (a, a) -> (Money a, a)
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money))
marginal' :: forall a.
(Fractional a, Ord a) =>
[(a, a)] -> Tax (Money a) (Money a)
marginal' = [(Money a, a)] -> Tax (Money a) (Money a)
forall a.
(Fractional a, Ord a) =>
[(Money a, a)] -> Tax (Money a) (Money a)
marginal ([(Money a, a)] -> Tax (Money a) (Money a))
-> ([(a, a)] -> [(Money a, a)])
-> [(a, a)]
-> Tax (Money a) (Money a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, a) -> (Money a, a)) -> [(a, a)] -> [(Money a, a)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> Money a) -> (a, a) -> (Money a, a)
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (AReview (Money a) a -> a -> Money a
forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review AReview (Money a) a
forall a b (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p a (f b) -> p (Money a) (f (Money b))
money))
class HasTaxableIncome a b c where
taxableIncome :: Getter (a b) (Money c)
instance
(Foldable t, HasTaxableIncome x a a, Num a)
=> HasTaxableIncome t (x a) a
where
taxableIncome :: Getter (t (x a)) (Money a)
taxableIncome = (t (x a) -> Money a)
-> (Money a -> f (Money a)) -> t (x a) -> f (t (x a))
forall (p :: * -> * -> *) (f :: * -> *) s a.
(Profunctor p, Contravariant f) =>
(s -> a) -> Optic' p f s a
to ((x a -> Money a) -> t (x a) -> Money a
forall m a. Monoid m => (a -> m) -> t a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Getting (Money a) (x a) (Money a) -> x a -> Money a
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Money a) (x a) (Money a)
forall {k} (a :: k -> *) (b :: k) c.
HasTaxableIncome a b c =>
Getter (a b) (Money c)
Getter (x a) (Money a)
taxableIncome))