module LendingClub.Listing
( Listing (..)
, Offer (..)
, Credit (..)
, Grade (..)
, SubGrade (..)
, Purpose (..)
) where
import Control.Applicative
import Control.Monad (mzero)
import Data.Aeson
import Data.Typeable
import GHC.Generics
import LendingClub.Money
data Listing = Listing
{ listingId :: !Int
, listingGrade :: !Grade
, subGrade :: !SubGrade
, purpose :: !Purpose
, fundedAmount :: !Money
, offer :: !Offer
, credit :: !Credit
} deriving Show
instance Eq Listing where
(Listing { listingId = id1 }) == (Listing { listingId = id2 }) =
id1 == id2
data Offer = Offer
{ requestAmount :: !Money
, rate :: !Double
, termInMonths :: !Int
} deriving Show
data Credit = Credit
{ fico :: !Int
, bankcardUtilization :: !Double
, isHomeowner :: !Bool
, debtToIncome :: !Double
, monthsEmployed :: !(Maybe Int)
, currentDelinquencies :: !(Maybe Int)
, amountDelinquent :: !(Maybe Money)
, openCreditLines :: !(Maybe Int)
, totOpenRevolvingAccts :: !(Maybe Int)
, revolvingBalance :: !(Maybe Money)
, revolvingAvailableCredit :: !(Maybe Int)
} deriving Show
instance FromJSON Listing where
parseJSON (Object v) = Listing
<$> v .: "id"
<*> v .: "grade"
<*> v .: "subGrade"
<*> v .: "purpose"
<*> v .: "fundedAmount"
<*> (Offer
<$> v .: "loanAmount"
<*> v .: "intRate"
<*> v .: "term")
<*> (Credit
<$> v .: "ficoRangeLow"
<*> v .: "bcUtil"
<*> (lcHomeowner <$> v .: "homeOwnership")
<*> v .: "dti"
<*> v .:? "empLength"
<*> v .:? "accNowDelinq"
<*> v .:? "delinqAmnt"
<*> v .:? "openAcc"
<*> v .:? "numRevAccts"
<*> v .:? "revolBal"
<*> v .:? "revolUtil"
)
parseJSON _ = mzero
data Homeownership
= RENT
| OWN
| MORTGAGE
| OTHER
deriving (Show, Eq, Typeable, Generic)
instance FromJSON Homeownership where
lcHomeowner :: Homeownership -> Bool
lcHomeowner OWN = True
lcHomeowner MORTGAGE = True
lcHomeowner _ = False
data Grade
= G
| F
| E
| D
| C
| B
| A
deriving (Show, Eq, Ord, Typeable, Generic, Read, Enum)
instance FromJSON Grade where
instance ToJSON Grade where
data SubGrade
= G5
| G4
| G3
| G2
| G1
| F5
| F4
| F3
| F2
| F1
| E5
| E4
| E3
| E2
| E1
| D5
| D4
| D3
| D2
| D1
| C5
| C4
| C3
| C2
| C1
| B5
| B4
| B3
| B2
| B1
| A5
| A4
| A3
| A2
| A1
deriving (Show, Eq, Ord, Typeable, Generic, Read, Enum)
instance FromJSON SubGrade where
data Purpose
= DebtConsolidation
| Medical
| HomeImprovement
| RenewableEnergy
| SmallBusiness
| Wedding
| Vacation
| Moving
| House
| Car
| MajorPurchase
| CreditCard
| Other
deriving (Show, Eq, Read)
instance FromJSON Purpose where
parseJSON (String "debt_consolidation") = pure DebtConsolidation
parseJSON (String "medical") = pure Medical
parseJSON (String "home_improvement") = pure HomeImprovement
parseJSON (String "renewable_energy") = pure RenewableEnergy
parseJSON (String "small_business") = pure SmallBusiness
parseJSON (String "wedding") = pure Wedding
parseJSON (String "vacation") = pure Vacation
parseJSON (String "moving") = pure Moving
parseJSON (String "house") = pure House
parseJSON (String "car") = pure Car
parseJSON (String "major_purchase") = pure MajorPurchase
parseJSON (String "credit_card") = pure CreditCard
parseJSON _ = pure Other