{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Tax.Canada.ON428.Fix (fixON428) where

import Control.Applicative (liftA2)
import Control.Monad (guard, mfilter)
import Data.Fixed (Centi)
import Rank2 qualified

import Tax.Canada.ON428.Types
import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf)

fixON428 :: ON428 Maybe -> ON428 Maybe
fixON428 :: ON428 Maybe -> ON428 Maybe
fixON428 = (ON428 Maybe -> ON428 Maybe) -> ON428 Maybe -> ON428 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((ON428 Maybe -> ON428 Maybe) -> ON428 Maybe -> ON428 Maybe)
-> (ON428 Maybe -> ON428 Maybe) -> ON428 Maybe -> ON428 Maybe
forall a b. (a -> b) -> a -> b
$ \on428 :: ON428 Maybe
on428@ON428{Page4 Maybe
Page3 Maybe
Page2 Maybe
Page1 Maybe
page1 :: Page1 Maybe
page2 :: Page2 Maybe
page3 :: Page3 Maybe
page4 :: Page4 Maybe
$sel:page1:ON428 :: forall (line :: * -> *). ON428 line -> Page1 line
$sel:page2:ON428 :: forall (line :: * -> *). ON428 line -> Page2 line
$sel:page3:ON428 :: forall (line :: * -> *). ON428 line -> Page3 line
$sel:page4:ON428 :: forall (line :: * -> *). ON428 line -> Page4 line
..}-> ON428{$sel:page1:ON428 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            $sel:page2:ON428 :: Page2 Maybe
page2 = ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON428 Maybe
on428 Page2 Maybe
page2,
                                            $sel:page3:ON428 :: Page3 Maybe
page3 = ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 ON428 Maybe
on428 Page3 Maybe
page3,
                                            $sel:page4:ON428 :: Page4 Maybe
page4 = ON428 Maybe -> Page4 Maybe -> Page4 Maybe
fixPage4 ON428 Maybe
on428 Page4 Maybe
page4}

fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 = (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe)
-> (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe
forall a b. (a -> b) -> a -> b
$ \Page1{Maybe Centi
Page1PartB Maybe
Page1PartA Maybe
line1 :: Maybe Centi
partA :: Page1PartA Maybe
partB :: Page1PartB Maybe
$sel:line1:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:partA:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartA line
$sel:partB:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartB line
..}-> Page1{
   $sel:line1:Page1 :: Maybe Centi
line1 = Maybe Centi
line1,
   $sel:partA:Page1 :: Page1PartA Maybe
partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
line1 Page1PartA Maybe
partA,
   $sel:partB:Page1 :: Page1PartB Maybe
partB = Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB Page1PartB Maybe
partB}

fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
income = (Page1PartA Maybe -> Page1PartA Maybe)
-> Page1PartA Maybe -> Page1PartA Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1PartA Maybe -> Page1PartA Maybe)
 -> Page1PartA Maybe -> Page1PartA Maybe)
-> (Page1PartA Maybe -> Page1PartA Maybe)
-> Page1PartA Maybe
-> Page1PartA Maybe
forall a b. (a -> b) -> a -> b
$ \Page1PartA{TaxIncomeBracket Maybe
column1 :: TaxIncomeBracket Maybe
column2 :: TaxIncomeBracket Maybe
column3 :: TaxIncomeBracket Maybe
column4 :: TaxIncomeBracket Maybe
column5 :: TaxIncomeBracket Maybe
$sel:column1:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column2:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column3:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column4:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column5:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
..}-> Page1PartA{
   $sel:column1:Page1PartA :: TaxIncomeBracket Maybe
column1 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column2) TaxIncomeBracket Maybe
column1,
   $sel:column2:Page1PartA :: TaxIncomeBracket Maybe
column2 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column3) TaxIncomeBracket Maybe
column2,
   $sel:column3:Page1PartA :: TaxIncomeBracket Maybe
column3 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column4) TaxIncomeBracket Maybe
column3,
   $sel:column4:Page1PartA :: TaxIncomeBracket Maybe
column4 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column5) TaxIncomeBracket Maybe
column4,
   $sel:column5:Page1PartA :: TaxIncomeBracket Maybe
column5 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income Maybe (TaxIncomeBracket Maybe)
forall a. Maybe a
Nothing TaxIncomeBracket Maybe
column5}

fixTaxIncomeBracket :: Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe
fixTaxIncomeBracket :: Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income Maybe (TaxIncomeBracket Maybe)
nextBracket bracket :: TaxIncomeBracket Maybe
bracket@TaxIncomeBracket{Maybe Rational
Maybe Centi
line2_income :: Maybe Centi
line3_threshold :: Maybe Centi
line4_overThreshold :: Maybe Centi
line5_rate :: Maybe Rational
line6_timesRate :: Maybe Centi
line7_baseTax :: Maybe Centi
line8_equalsTax :: Maybe Centi
$sel:line2_income:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Centi
$sel:line3_threshold:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Centi
$sel:line4_overThreshold:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Centi
$sel:line5_rate:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Rational
$sel:line6_timesRate:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Centi
$sel:line7_baseTax:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Centi
$sel:line8_equalsTax:TaxIncomeBracket :: forall (line :: * -> *). TaxIncomeBracket line -> line Centi
..} = TaxIncomeBracket Maybe
bracket{
   $sel:line2_income:TaxIncomeBracket :: Maybe Centi
line2_income = do Centi
i <- Maybe Centi
income
                     Centi
floor <- Maybe Centi
line3_threshold
                     let ceiling :: Maybe Centi
ceiling = Maybe (TaxIncomeBracket Maybe)
nextBracket Maybe (TaxIncomeBracket Maybe)
-> (TaxIncomeBracket Maybe -> Maybe Centi) -> Maybe Centi
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (.line3_threshold)
                     Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Centi
floor Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
<= Centi
i Bool -> Bool -> Bool
&& (Centi -> Bool) -> Maybe Centi -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Centi
i Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
<) Maybe Centi
ceiling)
                     Maybe Centi
income,
   $sel:line4_overThreshold:TaxIncomeBracket :: Maybe Centi
line4_overThreshold = (Centi -> Centi -> Centi)
-> Maybe Centi -> Maybe Centi -> Maybe Centi
forall a b c. (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (-) Maybe Centi
line2_income Maybe Centi
line3_threshold,
   $sel:line6_timesRate:TaxIncomeBracket :: Maybe Centi
line6_timesRate = Rational -> Centi
forall a. Fractional a => Rational -> a
fromRational (Rational -> Centi) -> Maybe Rational -> Maybe Centi
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Rational -> Rational -> Rational)
-> Maybe Rational -> Maybe Rational -> Maybe Rational
forall a b c. (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
(*) (Centi -> Rational
forall a. Real a => a -> Rational
toRational (Centi -> Rational) -> Maybe Centi -> Maybe Rational
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Centi
line4_overThreshold) Maybe Rational
line5_rate,
   $sel:line8_equalsTax:TaxIncomeBracket :: Maybe Centi
line8_equalsTax = (Centi -> Centi -> Centi)
-> Maybe Centi -> Maybe Centi -> Maybe Centi
forall a b c. (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Centi -> Centi -> Centi
forall a. Num a => a -> a -> a
(+) Maybe Centi
line6_timesRate Maybe Centi
line7_baseTax}

fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB = (Page1PartB Maybe -> Page1PartB Maybe)
-> Page1PartB Maybe -> Page1PartB Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1PartB Maybe -> Page1PartB Maybe)
 -> Page1PartB Maybe -> Page1PartB Maybe)
-> (Page1PartB Maybe -> Page1PartB Maybe)
-> Page1PartB Maybe
-> Page1PartB Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page1PartB Maybe
part@Page1PartB{Maybe Centi
line9_basic :: Maybe Centi
line10_age :: Maybe Centi
line11_base :: Maybe Centi
line12_spouseIncome :: Maybe Centi
line13_difference :: Maybe Centi
line13_cont :: Maybe Centi
line14_base :: Maybe Centi
line15_dependentIncome :: Maybe Centi
line16_difference :: Maybe Centi
line16_cont :: Maybe Centi
line17_caregiver :: Maybe Centi
line18 :: Maybe Centi
line19_cppQpp :: Maybe Centi
line20_cppQpp :: Maybe Centi
line21_employmentInsurance :: Maybe Centi
line22_employmentInsurance :: Maybe Centi
line23_adoption :: Maybe Centi
line24_sum :: Maybe Centi
line24_cont :: Maybe Centi
line25 :: Maybe Centi
$sel:line9_basic:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line10_age:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line11_base:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line12_spouseIncome:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line13_difference:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line13_cont:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line14_base:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line15_dependentIncome:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line16_difference:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line16_cont:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line17_caregiver:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line18:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line19_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line20_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line21_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line22_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line23_adoption:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line24_sum:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line24_cont:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line25:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
..}-> Page1PartB Maybe
part{
   $sel:line9_basic:Page1PartB :: Maybe Centi
line9_basic = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
11141,
   $sel:line11_base:Page1PartB :: Maybe Centi
line11_base = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
10406,
   $sel:line13_difference:Page1PartB :: Maybe Centi
line13_difference = (Centi -> Bool) -> Maybe Centi -> Maybe Centi
forall (m :: * -> *) a. MonadPlus m => (a -> Bool) -> m a -> m a
mfilter (Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
0) (Maybe Centi -> Maybe Centi) -> Maybe Centi -> Maybe Centi
forall a b. (a -> b) -> a -> b
$ (Centi -> Centi -> Centi)
-> Maybe Centi -> Maybe Centi -> Maybe Centi
forall a b c. (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (-) Maybe Centi
line11_base Maybe Centi
line12_spouseIncome,
   $sel:line13_cont:Page1PartB :: Maybe Centi
line13_cont = Maybe Centi
line13_difference,
   $sel:line14_base:Page1PartB :: Maybe Centi
line14_base = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
10406,
   $sel:line16_difference:Page1PartB :: Maybe Centi
line16_difference = (Centi -> Bool) -> Maybe Centi -> Maybe Centi
forall (m :: * -> *) a. MonadPlus m => (a -> Bool) -> m a -> m a
mfilter (Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
0) (Maybe Centi -> Maybe Centi) -> Maybe Centi -> Maybe Centi
forall a b. (a -> b) -> a -> b
$ (Centi -> Centi -> Centi)
-> Maybe Centi -> Maybe Centi -> Maybe Centi
forall a b c. (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (-) Maybe Centi
line14_base Maybe Centi
line15_dependentIncome,
   $sel:line16_cont:Page1PartB :: Maybe Centi
line16_cont = Maybe Centi
line16_difference,
   $sel:line18:Page1PartB :: Maybe Centi
line18 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line9_basic, Maybe Centi
line10_age, Maybe Centi
line13_cont, Maybe Centi
line16_cont, Maybe Centi
line17_caregiver],
   $sel:line24_sum:Page1PartB :: Maybe Centi
line24_sum = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line19_cppQpp,
                         Maybe Centi
line20_cppQpp,
                         Maybe Centi
line21_employmentInsurance,
                         Maybe Centi
line22_employmentInsurance,
                         Maybe Centi
line23_adoption],
   $sel:line24_cont:Page1PartB :: Maybe Centi
line24_cont = Maybe Centi
line24_sum,
   $sel:line25:Page1PartB :: Maybe Centi
line25 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line18, Maybe Centi
line24_cont]}

fixPage2 :: ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 :: ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON428 Maybe
on428 = (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe)
-> (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe
forall a b. (a -> b) -> a -> b
$ \Page2{Page2PartC Maybe
Page2PartB Maybe
partB :: Page2PartB Maybe
partC :: Page2PartC Maybe
$sel:partB:Page2 :: forall (line :: * -> *). Page2 line -> Page2PartB line
$sel:partC:Page2 :: forall (line :: * -> *). Page2 line -> Page2PartC line
..}-> Page2{
  $sel:partB:Page2 :: Page2PartB Maybe
partB = ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB ON428 Maybe
on428 Page2PartB Maybe
partB,
  $sel:partC:Page2 :: Page2PartC Maybe
partC = ON428 Maybe -> Page2PartC Maybe -> Page2PartC Maybe
fixPage2PartC ON428 Maybe
on428 Page2PartC Maybe
partC}

fixPage2PartB :: ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB :: ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB ON428 Maybe
on428 = (Page2PartB Maybe -> Page2PartB Maybe)
-> Page2PartB Maybe -> Page2PartB Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2PartB Maybe -> Page2PartB Maybe)
 -> Page2PartB Maybe -> Page2PartB Maybe)
-> (Page2PartB Maybe -> Page2PartB Maybe)
-> Page2PartB Maybe
-> Page2PartB Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page2PartB Maybe
part@Page2PartB{Maybe Rational
Maybe Centi
Donations Maybe
MedicalExpenses Maybe
line26 :: Maybe Centi
line27_pension :: Maybe Centi
line28 :: Maybe Centi
line29_disability :: Maybe Centi
line30 :: Maybe Centi
line31 :: Maybe Centi
line32_interest :: Maybe Centi
line33_education :: Maybe Centi
line34_transferred :: Maybe Centi
line35 :: Maybe Centi
medicalExpenses :: MedicalExpenses Maybe
line42 :: Maybe Centi
line43_sum :: Maybe Centi
line43_cont :: Maybe Centi
line44 :: Maybe Centi
line45_rate :: Maybe Rational
line46_fraction :: Maybe Centi
donations :: Donations Maybe
line50 :: Maybe Centi
$sel:line26:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line27_pension:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line28:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line29_disability:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line30:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line31:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line32_interest:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line33_education:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line34_transferred:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line35:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:medicalExpenses:Page2PartB :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
$sel:line42:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line43_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line43_cont:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line44:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line45_rate:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Rational
$sel:line46_fraction:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:donations:Page2PartB :: forall (line :: * -> *). Page2PartB line -> Donations line
$sel:line50:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
..}-> Page2PartB Maybe
part{
   $sel:line26:Page2PartB :: Maybe Centi
line26 = ON428 Maybe
on428.page1.partB.line25,
   $sel:line28:Page2PartB :: Maybe Centi
line28 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line26, Maybe Centi
line27_pension],
   $sel:line31:Page2PartB :: Maybe Centi
line31 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line28, Maybe Centi
line29_disability, Maybe Centi
line30],
   $sel:line35:Page2PartB :: Maybe Centi
line35 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line31, Maybe Centi
line32_interest, Maybe Centi
line33_education, Maybe Centi
line34_transferred],
   $sel:medicalExpenses:Page2PartB :: MedicalExpenses Maybe
medicalExpenses = MedicalExpenses Maybe -> MedicalExpenses Maybe
fixMedicalExpenses MedicalExpenses Maybe
medicalExpenses,
   $sel:line43_sum:Page2PartB :: Maybe Centi
line43_sum = [Maybe Centi] -> Maybe Centi
totalOf [MedicalExpenses Maybe
medicalExpenses.line41_difference, Maybe Centi
line42],
   $sel:line43_cont:Page2PartB :: Maybe Centi
line43_cont = Maybe Centi
line43_sum,
   $sel:line44:Page2PartB :: Maybe Centi
line44 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line35, Maybe Centi
line43_cont],
   $sel:line46_fraction:Page2PartB :: Maybe Centi
line46_fraction = Maybe Rational
line45_rate Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
line44,
   $sel:donations:Page2PartB :: Donations Maybe
donations = Donations Maybe -> Donations Maybe
fixDonations Donations Maybe
donations,
   $sel:line50:Page2PartB :: Maybe Centi
line50 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line46_fraction, Donations Maybe
donations.line49_cont]}

fixPage2PartC :: ON428 Maybe -> Page2PartC Maybe -> Page2PartC Maybe
fixPage2PartC :: ON428 Maybe -> Page2PartC Maybe -> Page2PartC Maybe
fixPage2PartC ON428 Maybe
on428 = (Page2PartC Maybe -> Page2PartC Maybe)
-> Page2PartC Maybe -> Page2PartC Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2PartC Maybe -> Page2PartC Maybe)
 -> Page2PartC Maybe -> Page2PartC Maybe)
-> (Page2PartC Maybe -> Page2PartC Maybe)
-> Page2PartC Maybe
-> Page2PartC Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page2PartC Maybe
part@Page2PartC{Maybe Centi
line51_tax :: Maybe Centi
line52_credits :: Maybe Centi
line53 :: Maybe Centi
line54 :: Maybe Centi
line55 :: Maybe Centi
line56 :: Maybe Centi
line57 :: Maybe Centi
line58 :: Maybe Centi
line59_copy :: Maybe Centi
line59_product :: Maybe Centi
line60_lesser :: Maybe Centi
line61 :: Maybe Centi
$sel:line51_tax:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line52_credits:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line53:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line54:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line55:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line56:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line57:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line58:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line59_copy:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line59_product:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line60_lesser:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line61:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
..}-> Page2PartC Maybe
part{
   $sel:line51_tax:Page2PartC :: Maybe Centi
line51_tax = [Maybe Centi] -> Maybe Centi
totalOf [ON428 Maybe
on428.page1.partA.column1.line8_equalsTax,
                         ON428 Maybe
on428.page1.partA.column2.line8_equalsTax,
                         ON428 Maybe
on428.page1.partA.column3.line8_equalsTax,
                         ON428 Maybe
on428.page1.partA.column4.line8_equalsTax,
                         ON428 Maybe
on428.page1.partA.column5.line8_equalsTax],
   $sel:line52_credits:Page2PartC :: Maybe Centi
line52_credits = ON428 Maybe
on428.page2.partB.line50,
   $sel:line53:Page2PartC :: Maybe Centi
line53 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line51_tax Maybe Centi
line52_credits,
   $sel:line55:Page2PartC :: Maybe Centi
line55 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line53, Maybe Centi
line54],
   $sel:line56:Page2PartC :: Maybe Centi
line56 = Maybe Centi
line53,
   $sel:line58:Page2PartC :: Maybe Centi
line58 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line56 Maybe Centi
line57,
   $sel:line59_product:Page2PartC :: Maybe Centi
line59_product = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.3367 Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
line59_copy,
   $sel:line60_lesser:Page2PartC :: Maybe Centi
line60_lesser = Centi -> Centi -> Centi
forall a. Ord a => a -> a -> a
min (Centi -> Centi -> Centi) -> Maybe Centi -> Maybe (Centi -> Centi)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Centi
line58 Maybe (Centi -> Centi) -> Maybe Centi -> Maybe Centi
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe Centi
line59_product,
   $sel:line61:Page2PartC :: Maybe Centi
line61 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line55 Maybe Centi
line60_lesser}

fixMedicalExpenses :: MedicalExpenses Maybe -> MedicalExpenses Maybe
fixMedicalExpenses :: MedicalExpenses Maybe -> MedicalExpenses Maybe
fixMedicalExpenses = (MedicalExpenses Maybe -> MedicalExpenses Maybe)
-> MedicalExpenses Maybe -> MedicalExpenses Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((MedicalExpenses Maybe -> MedicalExpenses Maybe)
 -> MedicalExpenses Maybe -> MedicalExpenses Maybe)
-> (MedicalExpenses Maybe -> MedicalExpenses Maybe)
-> MedicalExpenses Maybe
-> MedicalExpenses Maybe
forall a b. (a -> b) -> a -> b
$ \part :: MedicalExpenses Maybe
part@MedicalExpenses{Maybe Rational
Maybe Centi
line36_expenses :: Maybe Centi
line37_income :: Maybe Centi
line38_rate :: Maybe Rational
line39_fraction :: Maybe Centi
line40_lesser :: Maybe Centi
line41_difference :: Maybe Centi
$sel:line36_expenses:MedicalExpenses :: forall (line :: * -> *). MedicalExpenses line -> line Centi
$sel:line37_income:MedicalExpenses :: forall (line :: * -> *). MedicalExpenses line -> line Centi
$sel:line38_rate:MedicalExpenses :: forall (line :: * -> *). MedicalExpenses line -> line Rational
$sel:line39_fraction:MedicalExpenses :: forall (line :: * -> *). MedicalExpenses line -> line Centi
$sel:line40_lesser:MedicalExpenses :: forall (line :: * -> *). MedicalExpenses line -> line Centi
$sel:line41_difference:MedicalExpenses :: forall (line :: * -> *). MedicalExpenses line -> line Centi
..} -> MedicalExpenses Maybe
part{
   $sel:line38_rate:MedicalExpenses :: Maybe Rational
line38_rate = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.03,
   $sel:line39_fraction:MedicalExpenses :: Maybe Centi
line39_fraction = Maybe Rational
line38_rate Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
line37_income,
   $sel:line40_lesser:MedicalExpenses :: Maybe Centi
line40_lesser = Centi -> Centi -> Centi
forall a. Ord a => a -> a -> a
min Centi
2522 (Centi -> Centi) -> Maybe Centi -> Maybe Centi
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Centi
line39_fraction,
   $sel:line41_difference:MedicalExpenses :: Maybe Centi
line41_difference = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line36_expenses Maybe Centi
line40_lesser}

fixDonations :: Donations Maybe -> Donations Maybe
fixDonations :: Donations Maybe -> Donations Maybe
fixDonations = (Donations Maybe -> Donations Maybe)
-> Donations Maybe -> Donations Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Donations Maybe -> Donations Maybe)
 -> Donations Maybe -> Donations Maybe)
-> (Donations Maybe -> Donations Maybe)
-> Donations Maybe
-> Donations Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Donations Maybe
part@Donations{Maybe Centi
line47_base :: Maybe Centi
line47_fraction :: Maybe Centi
line48_base :: Maybe Centi
line48_fraction :: Maybe Centi
line49_sum :: Maybe Centi
line49_cont :: Maybe Centi
$sel:line47_base:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line47_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line48_base:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line48_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line49_sum:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line49_cont:Donations :: forall (line :: * -> *). Donations line -> line Centi
..} -> Donations Maybe
part{
   $sel:line47_fraction:Donations :: Maybe Centi
line47_fraction = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.0505 Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
line47_base,
   $sel:line48_fraction:Donations :: Maybe Centi
line48_fraction = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.1116 Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
line48_base,
   $sel:line49_sum:Donations :: Maybe Centi
line49_sum = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line47_fraction, Maybe Centi
line48_fraction],
   $sel:line49_cont:Donations :: Maybe Centi
line49_cont = Maybe Centi
line49_sum}

fixPage3 :: ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 :: ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 ON428 Maybe
on428 = (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe)
-> (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe
forall a b. (a -> b) -> a -> b
$ \page :: Page3 Maybe
page@Page3{Maybe Word
Maybe Centi
line62 :: Maybe Centi
line63 :: Maybe Centi
line64 :: Maybe Centi
line65 :: Maybe Centi
line66_copy :: Maybe Centi
line66_surtax :: Maybe Centi
line67_copy :: Maybe Centi
line67_surtax :: Maybe Centi
line68_cont :: Maybe Centi
line68_sum :: Maybe Centi
line69 :: Maybe Centi
line70 :: Maybe Centi
line71 :: Maybe Centi
line72 :: Maybe Centi
line73 :: Maybe Centi
line74_basicReduction :: Maybe Centi
line75_amount :: Maybe Centi
line75_childrenNum :: Maybe Word
line76_amount :: Maybe Centi
line76_childrenNum :: Maybe Word
line77 :: Maybe Centi
line78_copy :: Maybe Centi
line78_product :: Maybe Centi
line79 :: Maybe Centi
line80_cont :: Maybe Centi
line80_difference :: Maybe Centi
line81 :: Maybe Centi
line82 :: Maybe Centi
line83 :: Maybe Centi
$sel:line62:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line63:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line64:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line65:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line66_copy:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line66_surtax:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line67_copy:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line67_surtax:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line68_cont:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line68_sum:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line69:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line70:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line71:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line72:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line73:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line74_basicReduction:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line75_amount:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line75_childrenNum:Page3 :: forall (line :: * -> *). Page3 line -> line Word
$sel:line76_amount:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line76_childrenNum:Page3 :: forall (line :: * -> *). Page3 line -> line Word
$sel:line77:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line78_copy:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line78_product:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line79:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line80_cont:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line80_difference:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line81:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line82:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line83:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
..}-> Page3 Maybe
page{
   $sel:line62:Page3 :: Maybe Centi
line62 = ON428 Maybe
on428.page2.partC.line61,
   $sel:line63:Page3 :: Maybe Centi
line63 = Maybe Centi
line62,
   $sel:line64:Page3 :: Maybe Centi
line64 = ON428 Maybe
on428.page2.partC.line54,
   $sel:line65:Page3 :: Maybe Centi
line65 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line63 Maybe Centi
line64,
   $sel:line66_copy:Page3 :: Maybe Centi
line66_copy = Maybe Centi
line65,
   $sel:line66_surtax:Page3 :: Maybe Centi
line66_surtax = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.2 Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line66_copy (Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
4991),
   $sel:line67_copy:Page3 :: Maybe Centi
line67_copy = Maybe Centi
line65,
   $sel:line67_surtax:Page3 :: Maybe Centi
line67_surtax = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.36 Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line67_copy (Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
6387),
   $sel:line68_sum:Page3 :: Maybe Centi
line68_sum = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line66_surtax, Maybe Centi
line67_surtax],
   $sel:line68_cont:Page3 :: Maybe Centi
line68_cont = Maybe Centi
line68_sum,
   $sel:line69:Page3 :: Maybe Centi
line69 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line62, Maybe Centi
line68_cont],
   $sel:line70:Page3 :: Maybe Centi
line70 = ON428 Maybe
on428.page2.partC.line57,
   $sel:line71:Page3 :: Maybe Centi
line71 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line69 Maybe Centi
line70,
   $sel:line73:Page3 :: Maybe Centi
line73 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line71, Maybe Centi
line72],
   $sel:line74_basicReduction:Page3 :: Maybe Centi
line74_basicReduction = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
257,
   $sel:line75_amount:Page3 :: Maybe Centi
line75_amount = ((Centi
475 Centi -> Centi -> Centi
forall a. Num a => a -> a -> a
*) (Centi -> Centi) -> (Word -> Centi) -> Word -> Centi
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Centi
forall a b. (Integral a, Num b) => a -> b
fromIntegral) (Word -> Centi) -> Maybe Word -> Maybe Centi
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Word
line75_childrenNum,
   $sel:line76_amount:Page3 :: Maybe Centi
line76_amount = ((Centi
475 Centi -> Centi -> Centi
forall a. Num a => a -> a -> a
*) (Centi -> Centi) -> (Word -> Centi) -> Word -> Centi
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Centi
forall a b. (Integral a, Num b) => a -> b
fromIntegral) (Word -> Centi) -> Maybe Word -> Maybe Centi
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Word
line76_childrenNum,
   $sel:line77:Page3 :: Maybe Centi
line77 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line74_basicReduction, Maybe Centi
line75_amount, Maybe Centi
line76_amount],
   $sel:line78_copy:Page3 :: Maybe Centi
line78_copy = Maybe Centi
line77,
   $sel:line78_product:Page3 :: Maybe Centi
line78_product = (Centi
2 Centi -> Centi -> Centi
forall a. Num a => a -> a -> a
*) (Centi -> Centi) -> Maybe Centi -> Maybe Centi
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Centi
line78_copy,
   $sel:line79:Page3 :: Maybe Centi
line79 = Maybe Centi
line73,
   $sel:line80_difference:Page3 :: Maybe Centi
line80_difference = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line78_product Maybe Centi
line79,
   $sel:line80_cont:Page3 :: Maybe Centi
line80_cont = Maybe Centi
line80_difference,
   $sel:line81:Page3 :: Maybe Centi
line81 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line73 Maybe Centi
line80_cont,
   $sel:line83:Page3 :: Maybe Centi
line83 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line81 Maybe Centi
line82}

fixPage4 :: ON428 Maybe -> Page4 Maybe -> Page4 Maybe
fixPage4 :: ON428 Maybe -> Page4 Maybe -> Page4 Maybe
fixPage4 ON428 Maybe
on428 = (Page4 Maybe -> Page4 Maybe) -> Page4 Maybe -> Page4 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page4 Maybe -> Page4 Maybe) -> Page4 Maybe -> Page4 Maybe)
-> (Page4 Maybe -> Page4 Maybe) -> Page4 Maybe -> Page4 Maybe
forall a b. (a -> b) -> a -> b
$ \page :: Page4 Maybe
page@Page4{Maybe Centi
HealthPremium Maybe
line84 :: Maybe Centi
line85_lift :: Maybe Centi
line86 :: Maybe Centi
line87_foodDonations :: Maybe Centi
line87_fraction :: Maybe Centi
line88 :: Maybe Centi
line89_health :: Maybe Centi
line90 :: Maybe Centi
healthPremium :: HealthPremium Maybe
$sel:line84:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line85_lift:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line86:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line87_foodDonations:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line87_fraction:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line88:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line89_health:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line90:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:healthPremium:Page4 :: forall (line :: * -> *). Page4 line -> HealthPremium line
..}-> Page4 Maybe
page{
   $sel:line84:Page4 :: Maybe Centi
line84 = ON428 Maybe
on428.page3.line83,
   $sel:line86:Page4 :: Maybe Centi
line86 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line84 Maybe Centi
line85_lift,
   $sel:line87_fraction:Page4 :: Maybe Centi
line87_fraction = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
0.25 Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
line87_foodDonations,
   $sel:line88:Page4 :: Maybe Centi
line88 = Maybe Centi -> Maybe Centi -> Maybe Centi
nonNegativeDifference Maybe Centi
line86 Maybe Centi
line87_fraction,
   $sel:line89_health:Page4 :: Maybe Centi
line89_health = [Maybe Centi] -> Maybe Centi
totalOf [Centi -> Centi -> Centi -> Maybe Centi
between Centi
0 Centi
20000 Centi
0,
                            HealthPremium Maybe
healthPremium.row1.equalsTax,
                            Centi -> Centi -> Centi -> Maybe Centi
between Centi
25000 Centi
36000 Centi
300,
                            HealthPremium Maybe
healthPremium.row2.equalsTax,
                            Centi -> Centi -> Centi -> Maybe Centi
between Centi
38500 Centi
48000 Centi
450,
                            HealthPremium Maybe
healthPremium.row3.equalsTax,
                            Centi -> Centi -> Centi -> Maybe Centi
between Centi
48600 Centi
72000 Centi
600,
                            HealthPremium Maybe
healthPremium.row4.equalsTax,
                            Centi -> Centi -> Centi -> Maybe Centi
between Centi
72600 Centi
200000 Centi
750,
                            HealthPremium Maybe
healthPremium.row5.equalsTax,
                            if Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
200600 then Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
900 else Maybe Centi
forall a. Maybe a
Nothing],
   $sel:line90:Page4 :: Maybe Centi
line90 = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
line88, Maybe Centi
line89_health],
   $sel:healthPremium:Page4 :: HealthPremium Maybe
healthPremium = Centi -> HealthPremium Maybe -> HealthPremium Maybe
fixHealthPremium Centi
income HealthPremium Maybe
healthPremium}
   where income :: Centi
income = Maybe Centi -> Centi
forall a. Num a => Maybe a -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ON428 Maybe
on428.page1.line1
         between :: Centi -> Centi -> Centi -> Maybe Centi
between Centi
floor Centi
ceiling Centi
tax
            | Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
floor Bool -> Bool -> Bool
&& Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
<= Centi
ceiling = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
tax
            | Bool
otherwise = Maybe Centi
forall a. Maybe a
Nothing

fixHealthPremium :: Centi -> HealthPremium Maybe -> HealthPremium Maybe
fixHealthPremium :: Centi -> HealthPremium Maybe -> HealthPremium Maybe
fixHealthPremium Centi
income = (HealthPremium Maybe -> HealthPremium Maybe)
-> HealthPremium Maybe -> HealthPremium Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((HealthPremium Maybe -> HealthPremium Maybe)
 -> HealthPremium Maybe -> HealthPremium Maybe)
-> (HealthPremium Maybe -> HealthPremium Maybe)
-> HealthPremium Maybe
-> HealthPremium Maybe
forall a b. (a -> b) -> a -> b
$ \HealthPremium{HealthPremiumBracket Maybe
row1 :: HealthPremiumBracket Maybe
row2 :: HealthPremiumBracket Maybe
row3 :: HealthPremiumBracket Maybe
row4 :: HealthPremiumBracket Maybe
row5 :: HealthPremiumBracket Maybe
$sel:row1:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row2:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row3:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row4:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row5:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
..}-> HealthPremium{
   $sel:row1:HealthPremium :: HealthPremiumBracket Maybe
row1 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
20000 Centi
25000 Rational
0.06 Centi
0 HealthPremiumBracket Maybe
row1,
   $sel:row2:HealthPremium :: HealthPremiumBracket Maybe
row2 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
36000 Centi
38500 Rational
0.06 Centi
300 HealthPremiumBracket Maybe
row2,
   $sel:row3:HealthPremium :: HealthPremiumBracket Maybe
row3 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
48000 Centi
48600 Rational
0.25 Centi
450 HealthPremiumBracket Maybe
row3,
   $sel:row4:HealthPremium :: HealthPremiumBracket Maybe
row4 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
72000 Centi
72600 Rational
0.25 Centi
600 HealthPremiumBracket Maybe
row4,
   $sel:row5:HealthPremium :: HealthPremiumBracket Maybe
row5 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
200000 Centi
200600 Rational
0.25 Centi
750 HealthPremiumBracket Maybe
row5}

fixHealthPremiumBracket :: Centi -> Centi -> Centi -> Rational -> Centi -> HealthPremiumBracket Maybe -> HealthPremiumBracket Maybe
fixHealthPremiumBracket :: Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
floor Centi
ceiling Rational
rate Centi
base HealthPremiumBracket{Maybe Centi
taxableIncome :: Maybe Centi
overThreshold :: Maybe Centi
timesRate :: Maybe Centi
equalsTax :: Maybe Centi
$sel:taxableIncome:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
$sel:overThreshold:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
$sel:timesRate:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
$sel:equalsTax:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
..}
   | Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
floor Bool -> Bool -> Bool
&& Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
< Centi
ceiling = HealthPremiumBracket{
       $sel:taxableIncome:HealthPremiumBracket :: Maybe Centi
taxableIncome = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
income,
       $sel:overThreshold:HealthPremiumBracket :: Maybe Centi
overThreshold = Centi -> Maybe Centi
forall a. a -> Maybe a
Just (Centi -> Maybe Centi) -> Centi -> Maybe Centi
forall a b. (a -> b) -> a -> b
$ Centi
income Centi -> Centi -> Centi
forall a. Num a => a -> a -> a
- Centi
floor,
       $sel:timesRate:HealthPremiumBracket :: Maybe Centi
timesRate = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
rate Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
overThreshold,
       $sel:equalsTax:HealthPremiumBracket :: Maybe Centi
equalsTax = [Maybe Centi] -> Maybe Centi
totalOf [Maybe Centi
timesRate, Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
base]}
   | Bool
otherwise = (forall a. Maybe a) -> HealthPremiumBracket Maybe
forall {k} (g :: (k -> *) -> *) (f :: k -> *).
Applicative g =>
(forall (a :: k). f a) -> g f
forall (f :: * -> *). (forall a. f a) -> HealthPremiumBracket f
Rank2.pure Maybe a
forall a. Maybe a
Nothing