{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Tax.Canada.Province.ON.ON428.Fix (ON428, fixON428) where import Control.Applicative (liftA2) import Control.Monad (guard, mfilter) import Data.Fixed (Centi) import Rank2 qualified import Tax.Canada.Province.ON.ON428.Types import Tax.Canada.Shared (fixBaseCredit, fixMedicalExpenses, fixSubCalculation, fixTaxIncomeBracket, BaseCredit(cont), MedicalExpenses (difference), SubCalculation (result), TaxIncomeBracket (equalsTax)) 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 page4 :: forall (line :: * -> *). ON428 line -> Page4 line page3 :: forall (line :: * -> *). ON428 line -> Page3 line page2 :: forall (line :: * -> *). ON428 line -> Page2 line page1 :: forall (line :: * -> *). ON428 line -> Page1 line ..}-> ON428{page1 :: Page1 Maybe page1 = Page1 Maybe -> Page1 Maybe fixPage1 Page1 Maybe page1, page2 :: Page2 Maybe page2 = ON428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 ON428 Maybe on428 Page2 Maybe page2, page3 :: Page3 Maybe page3 = ON428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 ON428 Maybe on428 Page3 Maybe page3, page4 :: 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 partB :: forall (line :: * -> *). Page1 line -> Page1PartB line partA :: forall (line :: * -> *). Page1 line -> Page1PartA line line1 :: forall (line :: * -> *). Page1 line -> line Centi ..}-> Page1{ line1 :: Maybe Centi line1 = Maybe Centi line1, partA :: Page1PartA Maybe partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA Maybe Centi line1 Page1PartA Maybe partA, partB :: 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 column5 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column4 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column3 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column2 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column1 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line ..}-> Page1PartA{ column1 :: 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, column2 :: 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, column3 :: 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, column4 :: 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, column5 :: 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} 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 SubCalculation Maybe BaseCredit Maybe line9_basic :: Maybe Centi line10_age :: Maybe Centi spouseAmount :: BaseCredit Maybe dependantAmount :: BaseCredit Maybe 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 :: SubCalculation Maybe line25 :: Maybe Centi line25 :: forall (line :: * -> *). Page1PartB line -> line Centi line24_sum :: forall (line :: * -> *). Page1PartB line -> SubCalculation line line23_adoption :: forall (line :: * -> *). Page1PartB line -> line Centi line22_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi line21_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi line20_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi line19_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi line18 :: forall (line :: * -> *). Page1PartB line -> line Centi line17_caregiver :: forall (line :: * -> *). Page1PartB line -> line Centi dependantAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line spouseAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line line10_age :: forall (line :: * -> *). Page1PartB line -> line Centi line9_basic :: forall (line :: * -> *). Page1PartB line -> line Centi ..}-> Page1PartB Maybe part{ line9_basic = Just 12_399, spouseAmount = fixBaseCredit spouseAmount, dependantAmount = fixBaseCredit dependantAmount, line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_caregiver], line24_sum = fixSubCalculation id $ totalOf [line19_cppQpp, line20_cppQpp, line21_employmentInsurance, line22_employmentInsurance, line23_adoption], line25 = totalOf [line18, line24_sum.result]} 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 partC :: forall (line :: * -> *). Page2 line -> Page2PartC line partB :: forall (line :: * -> *). Page2 line -> Page2PartB line ..}-> Page2{ partB :: Page2PartB Maybe partB = ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB ON428 Maybe on428 Page2PartB Maybe partB, partC :: 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 SubCalculation Maybe MedicalExpenses Maybe Donations 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 :: SubCalculation Maybe line44 :: Maybe Centi line45_rate :: Maybe Rational line46_fraction :: Maybe Centi donations :: Donations Maybe line50 :: Maybe Centi line50 :: forall (line :: * -> *). Page2PartB line -> line Centi donations :: forall (line :: * -> *). Page2PartB line -> Donations line line46_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi line45_rate :: forall (line :: * -> *). Page2PartB line -> line Rational line44 :: forall (line :: * -> *). Page2PartB line -> line Centi line43_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line line42 :: forall (line :: * -> *). Page2PartB line -> line Centi medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line line35 :: forall (line :: * -> *). Page2PartB line -> line Centi line34_transferred :: forall (line :: * -> *). Page2PartB line -> line Centi line33_education :: forall (line :: * -> *). Page2PartB line -> line Centi line32_interest :: forall (line :: * -> *). Page2PartB line -> line Centi line31 :: forall (line :: * -> *). Page2PartB line -> line Centi line30 :: forall (line :: * -> *). Page2PartB line -> line Centi line29_disability :: forall (line :: * -> *). Page2PartB line -> line Centi line28 :: forall (line :: * -> *). Page2PartB line -> line Centi line27_pension :: forall (line :: * -> *). Page2PartB line -> line Centi line26 :: forall (line :: * -> *). Page2PartB line -> line Centi ..}-> Page2PartB Maybe part{ line26 = on428.page1.partB.line25, line28 = totalOf [line26, line27_pension], line31 = totalOf [line28, line29_disability, line30], line35 = totalOf [line31, line32_interest, line33_education, line34_transferred], medicalExpenses = fixMedicalExpenses 2806 medicalExpenses, line43_sum = fixSubCalculation id $ totalOf [medicalExpenses.difference, line42], line44 = totalOf [line35, line43_sum.result], line46_fraction = line45_rate `fractionOf` line44, donations = fixDonations donations, line50 = totalOf [line46_fraction, donations.line49_sum.result]} 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 line61 :: forall (line :: * -> *). Page2PartC line -> line Centi line60_lesser :: forall (line :: * -> *). Page2PartC line -> line Centi line59_product :: forall (line :: * -> *). Page2PartC line -> line Centi line59_copy :: forall (line :: * -> *). Page2PartC line -> line Centi line58 :: forall (line :: * -> *). Page2PartC line -> line Centi line57 :: forall (line :: * -> *). Page2PartC line -> line Centi line56 :: forall (line :: * -> *). Page2PartC line -> line Centi line55 :: forall (line :: * -> *). Page2PartC line -> line Centi line54 :: forall (line :: * -> *). Page2PartC line -> line Centi line53 :: forall (line :: * -> *). Page2PartC line -> line Centi line52_credits :: forall (line :: * -> *). Page2PartC line -> line Centi line51_tax :: forall (line :: * -> *). Page2PartC line -> line Centi ..}-> Page2PartC Maybe part{ line51_tax = totalOf [on428.page1.partA.column1.equalsTax, on428.page1.partA.column2.equalsTax, on428.page1.partA.column3.equalsTax, on428.page1.partA.column4.equalsTax, on428.page1.partA.column5.equalsTax], line52_credits = on428.page2.partB.line50, line53 = nonNegativeDifference line51_tax line52_credits, line55 = totalOf [line53, line54], line56 = line53, line58 = nonNegativeDifference line56 line57, line59_product = Just 0.3367 `fractionOf` line59_copy, line60_lesser = min <$> line58 <*> line59_product, line61 = nonNegativeDifference line55 line60_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 SubCalculation Maybe line47_base :: Maybe Centi line47_fraction :: Maybe Centi line48_base :: Maybe Centi line48_fraction :: Maybe Centi line49_sum :: SubCalculation Maybe line49_sum :: forall (line :: * -> *). Donations line -> SubCalculation line line48_fraction :: forall (line :: * -> *). Donations line -> line Centi line48_base :: forall (line :: * -> *). Donations line -> line Centi line47_fraction :: forall (line :: * -> *). Donations line -> line Centi line47_base :: forall (line :: * -> *). Donations line -> line Centi ..} -> Donations Maybe part{ line47_fraction = Just 0.0505 `fractionOf` line47_base, line48_fraction = Just 0.1116 `fractionOf` line48_base, line49_sum = fixSubCalculation id $ totalOf [line47_fraction, line48_fraction]} 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 SubCalculation Maybe line62 :: Maybe Centi line63 :: Maybe Centi line64 :: Maybe Centi line65 :: Maybe Centi line66_surtax :: SubCalculation Maybe line67_surtax :: SubCalculation Maybe line68_sum :: SubCalculation Maybe 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_double :: SubCalculation Maybe line79 :: Maybe Centi line80_difference :: SubCalculation Maybe line81 :: Maybe Centi line82 :: Maybe Centi line83 :: Maybe Centi line83 :: forall (line :: * -> *). Page3 line -> line Centi line82 :: forall (line :: * -> *). Page3 line -> line Centi line81 :: forall (line :: * -> *). Page3 line -> line Centi line80_difference :: forall (line :: * -> *). Page3 line -> SubCalculation line line79 :: forall (line :: * -> *). Page3 line -> line Centi line78_double :: forall (line :: * -> *). Page3 line -> SubCalculation line line77 :: forall (line :: * -> *). Page3 line -> line Centi line76_childrenNum :: forall (line :: * -> *). Page3 line -> line Word line76_amount :: forall (line :: * -> *). Page3 line -> line Centi line75_childrenNum :: forall (line :: * -> *). Page3 line -> line Word line75_amount :: forall (line :: * -> *). Page3 line -> line Centi line74_basicReduction :: forall (line :: * -> *). Page3 line -> line Centi line73 :: forall (line :: * -> *). Page3 line -> line Centi line72 :: forall (line :: * -> *). Page3 line -> line Centi line71 :: forall (line :: * -> *). Page3 line -> line Centi line70 :: forall (line :: * -> *). Page3 line -> line Centi line69 :: forall (line :: * -> *). Page3 line -> line Centi line68_sum :: forall (line :: * -> *). Page3 line -> SubCalculation line line67_surtax :: forall (line :: * -> *). Page3 line -> SubCalculation line line66_surtax :: forall (line :: * -> *). Page3 line -> SubCalculation line line65 :: forall (line :: * -> *). Page3 line -> line Centi line64 :: forall (line :: * -> *). Page3 line -> line Centi line63 :: forall (line :: * -> *). Page3 line -> line Centi line62 :: forall (line :: * -> *). Page3 line -> line Centi ..}-> Page3 Maybe page{ line62 = on428.page2.partC.line61, line63 = line62, line64 = on428.page2.partC.line54, line65 = nonNegativeDifference line63 line64, line66_surtax = fixSubCalculation (\Rational x-> Rational 0.2 Rational -> Rational -> Rational forall a. Num a => a -> a -> a * Rational -> Rational -> Rational forall a. Ord a => a -> a -> a max Rational 0 (Rational x Rational -> Rational -> Rational forall a. Num a => a -> a -> a - Rational 5554)) line65, line67_surtax = fixSubCalculation (\Rational x-> Rational 0.36 Rational -> Rational -> Rational forall a. Num a => a -> a -> a * Rational -> Rational -> Rational forall a. Ord a => a -> a -> a max Rational 0 (Rational x Rational -> Rational -> Rational forall a. Num a => a -> a -> a - Rational 7108)) line65, line68_sum = fixSubCalculation id $ totalOf [line66_surtax.result, line67_surtax.result], line69 = totalOf [line62, line68_sum.result], line70 = on428.page2.partC.line57, line71 = nonNegativeDifference line69 line70, line73 = totalOf [line71, line72], line75_amount = ((506 *) . fromIntegral) <$> line75_childrenNum, line76_amount = ((506 *) . fromIntegral) <$> line76_childrenNum, line77 = totalOf [line74_basicReduction, line75_amount, line76_amount], line78_double = fixSubCalculation (2 *) line77, line79 = line73, line80_difference = fixSubCalculation id $ nonNegativeDifference line78_double.result line79, line81 = nonNegativeDifference line73 line80_difference.result, line83 = nonNegativeDifference line81 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 healthPremium :: forall (line :: * -> *). Page4 line -> HealthPremium line line90 :: forall (line :: * -> *). Page4 line -> line Centi line89_health :: forall (line :: * -> *). Page4 line -> line Centi line88 :: forall (line :: * -> *). Page4 line -> line Centi line87_fraction :: forall (line :: * -> *). Page4 line -> line Centi line87_foodDonations :: forall (line :: * -> *). Page4 line -> line Centi line86 :: forall (line :: * -> *). Page4 line -> line Centi line85_lift :: forall (line :: * -> *). Page4 line -> line Centi line84 :: forall (line :: * -> *). Page4 line -> line Centi ..}-> Page4 Maybe page{ line84 = on428.page3.line83, line86 = nonNegativeDifference line84 line85_lift, line87_fraction = Just 0.25 `fractionOf` line87_foodDonations, line88 = nonNegativeDifference line86 line87_fraction, line89_health = totalOf [between 0 20000 0, healthPremium.row1.equalsTax, between 25000 36000 300, healthPremium.row2.equalsTax, between 38500 48000 450, healthPremium.row3.equalsTax, between 48600 72000 600, healthPremium.row4.equalsTax, between 72600 200000 750, healthPremium.row5.equalsTax, if income > 200600 then Just 900 else Nothing], line90 = totalOf [line88, line89_health], healthPremium = fixHealthPremium income 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 row5 :: forall (line :: * -> *). HealthPremium line -> HealthPremiumBracket line row4 :: forall (line :: * -> *). HealthPremium line -> HealthPremiumBracket line row3 :: forall (line :: * -> *). HealthPremium line -> HealthPremiumBracket line row2 :: forall (line :: * -> *). HealthPremium line -> HealthPremiumBracket line row1 :: forall (line :: * -> *). HealthPremium line -> HealthPremiumBracket line ..}-> HealthPremium{ row1 :: 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, row2 :: 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, row3 :: 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, row4 :: 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, row5 :: 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 equalsTax :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi timesRate :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi overThreshold :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi taxableIncome :: 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{ taxableIncome :: Maybe Centi taxableIncome = Centi -> Maybe Centi forall a. a -> Maybe a Just Centi income, overThreshold :: 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, timesRate :: Maybe Centi timesRate = Rational -> Maybe Rational forall a. a -> Maybe a Just Rational rate Maybe Rational -> Maybe Centi -> Maybe Centi `fractionOf` Maybe Centi overThreshold, equalsTax :: Maybe Centi equalsTax = [Maybe Centi] -> Maybe Centi forall (f :: * -> *) a. (Foldable f, Num a) => f (Maybe a) -> Maybe a 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