{-# LANGUAGE OverloadedStrings #-}
module Net.Stocks
( Stock(..)
, Financials(..)
, FinancialsList(..)
, QueryType(..)
, Company
, stocksQuery
, financialsQuery
, peersQuery
, priceQuery
, getData
, getNonJSONData
) where
import Control.Monad
import Control.Applicative
import Data.Char
import Data.Aeson
import Data.List.NonEmpty
import Data.ByteString.Lazy.Char8
import Network.HTTP.Conduit
data Stock =
Stock { company :: String
, latestPrice :: Float
, latestTime :: String
, changePercent :: Float
} deriving (Show)
instance FromJSON Stock where
parseJSON = withObject "Stock" $ \v -> Stock
<$> v .: "companyName"
<*> v .: "latestPrice"
<*> v .: "latestTime"
<*> v .: "changePercent"
newtype FinancialsList = FinancialsList { financialsList :: NonEmpty Financials}
instance FromJSON FinancialsList where
parseJSON = withObject "FinancialsList" $ \v -> FinancialsList
<$> v .: "financials"
data Financials =
Financials { reportDate :: String
, grossProfit :: Int
, costOfRevenue :: Int
, cashFlow :: Int
} deriving (Show)
instance FromJSON Financials where
parseJSON = withObject "Financials" $ \v -> Financials
<$> v .: "reportDate"
<*> v .: "grossProfit"
<*> v .: "costOfRevenue"
<*> v .: "cashFlow"
type Company = String
lowerString :: Company -> String
lowerString str = Prelude.map toLower str
baseURL :: String
baseURL = "https://api.iextrading.com/1.0/stock/"
data QueryType = QueryStocks
| QueryFinancials
| QueryPeers
| QueryPrice
stocksQuery :: Company -> String
stocksQuery company = baseURL ++ lowerString company ++ "/quote"
financialsQuery :: Company -> String
financialsQuery company = baseURL ++ lowerString company ++ "/financials"
peersQuery :: Company -> String
peersQuery company = baseURL ++ lowerString company ++ "/peers"
priceQuery :: Company -> String
priceQuery company = baseURL ++ lowerString company ++ "/price"
getData :: (FromJSON a) => String -> QueryType -> IO (Maybe a)
getData company qt = do
obj <- simpleHttp (query qt company)
return $ decode obj
where
query QueryStocks = stocksQuery
query QueryFinancials = financialsQuery
getNonJSONData :: String -> QueryType -> IO ByteString
getNonJSONData company qt = do
obj <- simpleHttp (query qt company)
return obj
where
query QueryPeers = peersQuery
query QueryPrice = priceQuery