packages feed

stocks 0.1.0.0 → 0.2.0.0

raw patch · 27 files changed

+1115/−110 lines, 27 filesdep +HUnitdep +containersdep +stocksdep ~basePVP ok

version bump matches the API change (PVP)

Dependencies added: HUnit, containers, stocks, unordered-containers

Dependency ranges changed: base

API changes (from Hackage documentation)

- Net.Stocks: Financials :: String -> Int -> Int -> Int -> Financials
- Net.Stocks: FinancialsList :: NonEmpty Financials -> FinancialsList
- Net.Stocks: QueryFinancials :: QueryType
- Net.Stocks: QueryPeers :: QueryType
- Net.Stocks: QueryPrice :: QueryType
- Net.Stocks: QueryStocks :: QueryType
- Net.Stocks: Stock :: String -> Float -> String -> Float -> Stock
- Net.Stocks: [cashFlow] :: Financials -> Int
- Net.Stocks: [changePercent] :: Stock -> Float
- Net.Stocks: [costOfRevenue] :: Financials -> Int
- Net.Stocks: [financialsList] :: FinancialsList -> NonEmpty Financials
- Net.Stocks: [grossProfit] :: Financials -> Int
- Net.Stocks: [latestPrice] :: Stock -> Float
- Net.Stocks: [latestTime] :: Stock -> String
- Net.Stocks: [reportDate] :: Financials -> String
- Net.Stocks: data Financials
- Net.Stocks: data QueryType
- Net.Stocks: data Stock
- Net.Stocks: financialsQuery :: Company -> String
- Net.Stocks: getData :: (FromJSON a) => String -> QueryType -> IO (Maybe a)
- Net.Stocks: getNonJSONData :: String -> QueryType -> IO ByteString
- Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.Financials
- Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.FinancialsList
- Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.Stock
- Net.Stocks: instance GHC.Show.Show Net.Stocks.Financials
- Net.Stocks: instance GHC.Show.Show Net.Stocks.Stock
- Net.Stocks: newtype FinancialsList
- Net.Stocks: peersQuery :: Company -> String
- Net.Stocks: priceQuery :: Company -> String
- Net.Stocks: stocksQuery :: Company -> String
- Net.Stocks: type Company = String
+ Net.IEX.Book: Book :: Quote -> Maybe [Trade] -> Maybe [Trade] -> [Trade] -> Book
+ Net.IEX.Book: [asks] :: Book -> Maybe [Trade]
+ Net.IEX.Book: [bids] :: Book -> Maybe [Trade]
+ Net.IEX.Book: [quote] :: Book -> Quote
+ Net.IEX.Book: [trades] :: Book -> [Trade]
+ Net.IEX.Book: data Book
+ Net.IEX.Book: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Book.Book
+ Net.IEX.Book: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Book.Trade
+ Net.IEX.Book: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Book.Book
+ Net.IEX.Book: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Book.Trade
+ Net.IEX.Book: instance GHC.Classes.Eq Net.IEX.Book.Book
+ Net.IEX.Book: instance GHC.Classes.Eq Net.IEX.Book.Trade
+ Net.IEX.Book: instance GHC.Generics.Generic Net.IEX.Book.Book
+ Net.IEX.Book: instance GHC.Generics.Generic Net.IEX.Book.Trade
+ Net.IEX.Book: instance GHC.Show.Show Net.IEX.Book.Book
+ Net.IEX.Book: instance GHC.Show.Show Net.IEX.Book.Trade
+ Net.IEX.Chart: Chart :: Maybe String -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe [Integer] -> Double -> Double -> Integer -> String -> Double -> Maybe String -> Maybe Double -> Maybe Double -> Maybe Integer -> Maybe Double -> Maybe Double -> Maybe Double -> Chart
+ Net.IEX.Chart: [average] :: Chart -> Maybe Double
+ Net.IEX.Chart: [changeOverTime] :: Chart -> Double
+ Net.IEX.Chart: [changePercent] :: Chart -> Maybe Double
+ Net.IEX.Chart: [change] :: Chart -> Maybe Double
+ Net.IEX.Chart: [close] :: Chart -> Maybe Double
+ Net.IEX.Chart: [date] :: Chart -> Maybe String
+ Net.IEX.Chart: [high] :: Chart -> Double
+ Net.IEX.Chart: [label] :: Chart -> String
+ Net.IEX.Chart: [low] :: Chart -> Double
+ Net.IEX.Chart: [marketAverage] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketChangeOverTime] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketHigh] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketLow] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketNotional] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketNumberOfTrades] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketVolume] :: Chart -> Maybe Double
+ Net.IEX.Chart: [minute] :: Chart -> Maybe String
+ Net.IEX.Chart: [notional] :: Chart -> Maybe Double
+ Net.IEX.Chart: [numberOfTrades] :: Chart -> Maybe Double
+ Net.IEX.Chart: [open] :: Chart -> Maybe Double
+ Net.IEX.Chart: [simplifyFactor] :: Chart -> Maybe [Integer]
+ Net.IEX.Chart: [unadjustedVolume] :: Chart -> Maybe Integer
+ Net.IEX.Chart: [volume] :: Chart -> Integer
+ Net.IEX.Chart: [vwap] :: Chart -> Maybe Double
+ Net.IEX.Chart: data Chart
+ Net.IEX.Chart: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance GHC.Classes.Eq Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance GHC.Generics.Generic Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance GHC.Show.Show Net.IEX.Chart.Chart
+ Net.IEX.Company: Company :: String -> String -> String -> String -> String -> String -> String -> String -> String -> Company
+ Net.IEX.Company: [ceo] :: Company -> String
+ Net.IEX.Company: [companyName] :: Company -> String
+ Net.IEX.Company: [description] :: Company -> String
+ Net.IEX.Company: [exchange] :: Company -> String
+ Net.IEX.Company: [industry] :: Company -> String
+ Net.IEX.Company: [issueType] :: Company -> String
+ Net.IEX.Company: [sector] :: Company -> String
+ Net.IEX.Company: [symbol] :: Company -> String
+ Net.IEX.Company: [website] :: Company -> String
+ Net.IEX.Company: data Company
+ Net.IEX.Company: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Company.Company
+ Net.IEX.Company: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Company.Company
+ Net.IEX.Company: instance GHC.Classes.Eq Net.IEX.Company.Company
+ Net.IEX.Company: instance GHC.Generics.Generic Net.IEX.Company.Company
+ Net.IEX.Company: instance GHC.Show.Show Net.IEX.Company.Company
+ Net.IEX.DelayedQuote: DelayedQuote :: String -> Double -> Double -> Double -> Double -> Integer -> Integer -> DelayedQuote
+ Net.IEX.DelayedQuote: [delayedPriceTime] :: DelayedQuote -> Integer
+ Net.IEX.DelayedQuote: [delayedPrice] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [delayedSize] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [high] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [low] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [processedTime] :: DelayedQuote -> Integer
+ Net.IEX.DelayedQuote: [symbol] :: DelayedQuote -> String
+ Net.IEX.DelayedQuote: data DelayedQuote
+ Net.IEX.DelayedQuote: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance GHC.Classes.Eq Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance GHC.Generics.Generic Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance GHC.Show.Show Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.Dividend: Dividend :: String -> String -> String -> String -> Double -> String -> String -> String -> String -> Dividend
+ Net.IEX.Dividend: [amount] :: Dividend -> Double
+ Net.IEX.Dividend: [declaredDate] :: Dividend -> String
+ Net.IEX.Dividend: [dtype] :: Dividend -> String
+ Net.IEX.Dividend: [exDate] :: Dividend -> String
+ Net.IEX.Dividend: [flag] :: Dividend -> String
+ Net.IEX.Dividend: [indicated] :: Dividend -> String
+ Net.IEX.Dividend: [paymentDate] :: Dividend -> String
+ Net.IEX.Dividend: [qualified] :: Dividend -> String
+ Net.IEX.Dividend: [recordDate] :: Dividend -> String
+ Net.IEX.Dividend: data Dividend
+ Net.IEX.Dividend: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance GHC.Classes.Eq Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance GHC.Generics.Generic Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance GHC.Show.Show Net.IEX.Dividend.Dividend
+ Net.IEX.Earnings: Earning :: Double -> Double -> Double -> String -> Integer -> Double -> String -> String -> String -> Earning
+ Net.IEX.Earnings: Earnings :: String -> [Earning] -> Earnings
+ Net.IEX.Earnings: [actualEPS] :: Earning -> Double
+ Net.IEX.Earnings: [announceTime] :: Earning -> String
+ Net.IEX.Earnings: [consensusEPS] :: Earning -> Double
+ Net.IEX.Earnings: [earnings] :: Earnings -> [Earning]
+ Net.IEX.Earnings: [epsReportDate] :: Earning -> String
+ Net.IEX.Earnings: [epsSurpriseDollar] :: Earning -> Double
+ Net.IEX.Earnings: [estimatedEPS] :: Earning -> Double
+ Net.IEX.Earnings: [fiscalEndDate] :: Earning -> String
+ Net.IEX.Earnings: [fiscalPeriod] :: Earning -> String
+ Net.IEX.Earnings: [numberOfEstimates] :: Earning -> Integer
+ Net.IEX.Earnings: [symbol] :: Earnings -> String
+ Net.IEX.Earnings: data Earning
+ Net.IEX.Earnings: data Earnings
+ Net.IEX.Earnings: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance GHC.Classes.Eq Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance GHC.Classes.Eq Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance GHC.Generics.Generic Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance GHC.Generics.Generic Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance GHC.Show.Show Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance GHC.Show.Show Net.IEX.Earnings.Earnings
+ Net.IEX.EffectiveSpread: EffectiveSpread :: Integer -> String -> String -> Double -> Double -> Double -> EffectiveSpread
+ Net.IEX.EffectiveSpread: [effectiveQuoted] :: EffectiveSpread -> Double
+ Net.IEX.EffectiveSpread: [effectiveSpread] :: EffectiveSpread -> Double
+ Net.IEX.EffectiveSpread: [priceImprovement] :: EffectiveSpread -> Double
+ Net.IEX.EffectiveSpread: [venueName] :: EffectiveSpread -> String
+ Net.IEX.EffectiveSpread: [venue] :: EffectiveSpread -> String
+ Net.IEX.EffectiveSpread: [volume] :: EffectiveSpread -> Integer
+ Net.IEX.EffectiveSpread: data EffectiveSpread
+ Net.IEX.EffectiveSpread: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance GHC.Classes.Eq Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance GHC.Generics.Generic Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance GHC.Show.Show Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.Financials: Financial :: String -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Maybe Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Maybe String -> Financial
+ Net.IEX.Financials: Financials :: String -> [Financial] -> Financials
+ Net.IEX.Financials: [cashChange] :: Financial -> Integer
+ Net.IEX.Financials: [cashFlow] :: Financial -> Integer
+ Net.IEX.Financials: [costOfRevenue] :: Financial -> Integer
+ Net.IEX.Financials: [currentAssets] :: Financial -> Integer
+ Net.IEX.Financials: [currentCash] :: Financial -> Integer
+ Net.IEX.Financials: [currentDebt] :: Financial -> Integer
+ Net.IEX.Financials: [financials] :: Financials -> [Financial]
+ Net.IEX.Financials: [grossProfit] :: Financial -> Integer
+ Net.IEX.Financials: [netIncome] :: Financial -> Integer
+ Net.IEX.Financials: [operatingExpense] :: Financial -> Integer
+ Net.IEX.Financials: [operatingGainsLosses] :: Financial -> Maybe String
+ Net.IEX.Financials: [operatingIncome] :: Financial -> Integer
+ Net.IEX.Financials: [operatingRevenue] :: Financial -> Integer
+ Net.IEX.Financials: [reportDate] :: Financial -> String
+ Net.IEX.Financials: [researchAndDevelopment] :: Financial -> Integer
+ Net.IEX.Financials: [shareholderEquity] :: Financial -> Integer
+ Net.IEX.Financials: [symbol] :: Financials -> String
+ Net.IEX.Financials: [totalAssets] :: Financial -> Integer
+ Net.IEX.Financials: [totalCash] :: Financial -> Integer
+ Net.IEX.Financials: [totalDebt] :: Financial -> Integer
+ Net.IEX.Financials: [totalLiabilities] :: Financial -> Maybe Integer
+ Net.IEX.Financials: [totalRevenue] :: Financial -> Integer
+ Net.IEX.Financials: data Financial
+ Net.IEX.Financials: data Financials
+ Net.IEX.Financials: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance GHC.Classes.Eq Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance GHC.Classes.Eq Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance GHC.Generics.Generic Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance GHC.Generics.Generic Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance GHC.Show.Show Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance GHC.Show.Show Net.IEX.Financials.Financials
+ Net.IEX.IntraDayStats: IntraDayStats :: IntraDaySub -> IntraDaySub -> IntraDaySub -> IntraDaySub -> IntraDaySub -> IntraDayStats
+ Net.IEX.IntraDayStats: IntraDaySub :: Maybe Double -> Integer -> IntraDaySub
+ Net.IEX.IntraDayStats: [lastUpdated] :: IntraDaySub -> Integer
+ Net.IEX.IntraDayStats: [marketShare] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [notional] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [routedVolume] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [symbolsTraded] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [value] :: IntraDaySub -> Maybe Double
+ Net.IEX.IntraDayStats: [volume] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: data IntraDayStats
+ Net.IEX.IntraDayStats: data IntraDaySub
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance GHC.Classes.Eq Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance GHC.Classes.Eq Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance GHC.Generics.Generic Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance GHC.Generics.Generic Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance GHC.Show.Show Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance GHC.Show.Show Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.Market: Market :: String -> String -> String -> Integer -> Integer -> Integer -> Integer -> Double -> Integer -> Market
+ Net.IEX.Market: [lastUpdated] :: Market -> Integer
+ Net.IEX.Market: [marketPercent] :: Market -> Double
+ Net.IEX.Market: [mic] :: Market -> String
+ Net.IEX.Market: [tapeA] :: Market -> Integer
+ Net.IEX.Market: [tapeB] :: Market -> Integer
+ Net.IEX.Market: [tapeC] :: Market -> Integer
+ Net.IEX.Market: [tapeId] :: Market -> String
+ Net.IEX.Market: [venueName] :: Market -> String
+ Net.IEX.Market: [volume] :: Market -> Integer
+ Net.IEX.Market: data Market
+ Net.IEX.Market: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Market.Market
+ Net.IEX.Market: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Market.Market
+ Net.IEX.Market: instance GHC.Classes.Eq Net.IEX.Market.Market
+ Net.IEX.Market: instance GHC.Generics.Generic Net.IEX.Market.Market
+ Net.IEX.Market: instance GHC.Show.Show Net.IEX.Market.Market
+ Net.IEX.NewsItem: NewsItem :: String -> String -> String -> String -> String -> String -> NewsItem
+ Net.IEX.NewsItem: [datetime] :: NewsItem -> String
+ Net.IEX.NewsItem: [headline] :: NewsItem -> String
+ Net.IEX.NewsItem: [related] :: NewsItem -> String
+ Net.IEX.NewsItem: [source] :: NewsItem -> String
+ Net.IEX.NewsItem: [summary] :: NewsItem -> String
+ Net.IEX.NewsItem: [url] :: NewsItem -> String
+ Net.IEX.NewsItem: data NewsItem
+ Net.IEX.NewsItem: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance GHC.Classes.Eq Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance GHC.Generics.Generic Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance GHC.Show.Show Net.IEX.NewsItem.NewsItem
+ Net.IEX.OHLC: OHLC :: PriceTime -> PriceTime -> Double -> Double -> OHLC
+ Net.IEX.OHLC: [close] :: OHLC -> PriceTime
+ Net.IEX.OHLC: [high] :: OHLC -> Double
+ Net.IEX.OHLC: [low] :: OHLC -> Double
+ Net.IEX.OHLC: [open] :: OHLC -> PriceTime
+ Net.IEX.OHLC: data OHLC
+ Net.IEX.OHLC: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance GHC.Classes.Eq Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance GHC.Generics.Generic Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance GHC.Show.Show Net.IEX.OHLC.OHLC
+ Net.IEX.Previous: Previous :: String -> String -> Double -> Double -> Double -> Double -> Integer -> Integer -> Double -> Double -> Double -> Previous
+ Net.IEX.Previous: [changePercent] :: Previous -> Double
+ Net.IEX.Previous: [change] :: Previous -> Double
+ Net.IEX.Previous: [close] :: Previous -> Double
+ Net.IEX.Previous: [date] :: Previous -> String
+ Net.IEX.Previous: [high] :: Previous -> Double
+ Net.IEX.Previous: [low] :: Previous -> Double
+ Net.IEX.Previous: [open] :: Previous -> Double
+ Net.IEX.Previous: [symbol] :: Previous -> String
+ Net.IEX.Previous: [unadjustedVolume] :: Previous -> Integer
+ Net.IEX.Previous: [volume] :: Previous -> Integer
+ Net.IEX.Previous: [vwap] :: Previous -> Double
+ Net.IEX.Previous: data Previous
+ Net.IEX.Previous: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance GHC.Classes.Eq Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance GHC.Generics.Generic Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance GHC.Show.Show Net.IEX.Previous.Previous
+ Net.IEX.PriceTime: PriceTime :: Double -> Integer -> PriceTime
+ Net.IEX.PriceTime: [price] :: PriceTime -> Double
+ Net.IEX.PriceTime: [time] :: PriceTime -> Integer
+ Net.IEX.PriceTime: data PriceTime
+ Net.IEX.PriceTime: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance GHC.Classes.Eq Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance GHC.Generics.Generic Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance GHC.Show.Show Net.IEX.PriceTime.PriceTime
+ Net.IEX.Quote: Quote :: String -> String -> String -> String -> String -> Double -> Integer -> Double -> Integer -> Double -> Double -> Double -> String -> String -> Integer -> Integer -> Maybe Double -> Maybe Integer -> Maybe Integer -> Double -> Integer -> Double -> Double -> Double -> Maybe Double -> Maybe Integer -> Integer -> Maybe Double -> Maybe Integer -> Maybe Double -> Maybe Integer -> Integer -> Double -> Double -> Double -> Double -> Quote
+ Net.IEX.Quote: [avgTotalVolume] :: Quote -> Integer
+ Net.IEX.Quote: [calculationPrice] :: Quote -> String
+ Net.IEX.Quote: [changePercent] :: Quote -> Double
+ Net.IEX.Quote: [change] :: Quote -> Double
+ Net.IEX.Quote: [closeTime] :: Quote -> Integer
+ Net.IEX.Quote: [close] :: Quote -> Double
+ Net.IEX.Quote: [companyName] :: Quote -> String
+ Net.IEX.Quote: [delayedPriceTime] :: Quote -> Integer
+ Net.IEX.Quote: [delayedPrice] :: Quote -> Double
+ Net.IEX.Quote: [high] :: Quote -> Double
+ Net.IEX.Quote: [iexAskPrice] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexAskSize] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexBidPrice] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexBidSize] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexLastUpdated] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexMarketPercent] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexRealtimePrice] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexRealtimeSize] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexVolume] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [latestPrice] :: Quote -> Double
+ Net.IEX.Quote: [latestSource] :: Quote -> String
+ Net.IEX.Quote: [latestTime] :: Quote -> String
+ Net.IEX.Quote: [latestUpdate] :: Quote -> Integer
+ Net.IEX.Quote: [latestVolume] :: Quote -> Integer
+ Net.IEX.Quote: [low] :: Quote -> Double
+ Net.IEX.Quote: [marketCap] :: Quote -> Integer
+ Net.IEX.Quote: [openTime] :: Quote -> Integer
+ Net.IEX.Quote: [open] :: Quote -> Double
+ Net.IEX.Quote: [peRatio] :: Quote -> Double
+ Net.IEX.Quote: [previousClose] :: Quote -> Double
+ Net.IEX.Quote: [primaryExchange] :: Quote -> String
+ Net.IEX.Quote: [sector] :: Quote -> String
+ Net.IEX.Quote: [symbol] :: Quote -> String
+ Net.IEX.Quote: [week52High] :: Quote -> Double
+ Net.IEX.Quote: [week52Low] :: Quote -> Double
+ Net.IEX.Quote: [ytdChange] :: Quote -> Double
+ Net.IEX.Quote: data Quote
+ Net.IEX.Quote: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance GHC.Classes.Eq Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance GHC.Generics.Generic Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance GHC.Show.Show Net.IEX.Quote.Quote
+ Net.IEX.RecentStats: RecentStats :: String -> Integer -> Integer -> Double -> Bool -> Integer -> RecentStats
+ Net.IEX.RecentStats: [date] :: RecentStats -> String
+ Net.IEX.RecentStats: [isHalfday] :: RecentStats -> Bool
+ Net.IEX.RecentStats: [litVolume] :: RecentStats -> Integer
+ Net.IEX.RecentStats: [marketShare] :: RecentStats -> Double
+ Net.IEX.RecentStats: [routedVolume] :: RecentStats -> Integer
+ Net.IEX.RecentStats: [volume] :: RecentStats -> Integer
+ Net.IEX.RecentStats: data RecentStats
+ Net.IEX.RecentStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance GHC.Classes.Eq Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance GHC.Generics.Generic Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance GHC.Show.Show Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecordStats: RecordStats :: RecordStatsSub -> RecordStatsSub -> RecordStatsSub -> RecordStatsSub -> RecordStats
+ Net.IEX.RecordStats: RecordStatsSub :: Double -> String -> Double -> Double -> RecordStatsSub
+ Net.IEX.RecordStats: [avg30Value] :: RecordStatsSub -> Double
+ Net.IEX.RecordStats: [notional] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: [previousDayValue] :: RecordStatsSub -> Double
+ Net.IEX.RecordStats: [recordDate] :: RecordStatsSub -> String
+ Net.IEX.RecordStats: [recordValue] :: RecordStatsSub -> Double
+ Net.IEX.RecordStats: [routedVolume] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: [symbolsTraded] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: [volume] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: data RecordStats
+ Net.IEX.RecordStats: data RecordStatsSub
+ Net.IEX.RecordStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance GHC.Classes.Eq Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance GHC.Classes.Eq Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance GHC.Generics.Generic Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance GHC.Generics.Generic Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance GHC.Show.Show Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance GHC.Show.Show Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.Relevant: Relevant :: Bool -> [String] -> Relevant
+ Net.IEX.Relevant: [peers] :: Relevant -> Bool
+ Net.IEX.Relevant: [symbols] :: Relevant -> [String]
+ Net.IEX.Relevant: data Relevant
+ Net.IEX.Relevant: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance GHC.Classes.Eq Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance GHC.Generics.Generic Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance GHC.Show.Show Net.IEX.Relevant.Relevant
+ Net.IEX.Split: Split :: String -> String -> String -> String -> Double -> Integer -> Integer -> Split
+ Net.IEX.Split: [declaredDate] :: Split -> String
+ Net.IEX.Split: [exDate] :: Split -> String
+ Net.IEX.Split: [forFactor] :: Split -> Integer
+ Net.IEX.Split: [paymentDate] :: Split -> String
+ Net.IEX.Split: [ratio] :: Split -> Double
+ Net.IEX.Split: [recordDate] :: Split -> String
+ Net.IEX.Split: [toFactor] :: Split -> Integer
+ Net.IEX.Split: data Split
+ Net.IEX.Split: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Split.Split
+ Net.IEX.Split: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Split.Split
+ Net.IEX.Split: instance GHC.Classes.Eq Net.IEX.Split.Split
+ Net.IEX.Split: instance GHC.Generics.Generic Net.IEX.Split.Split
+ Net.IEX.Split: instance GHC.Show.Show Net.IEX.Split.Split
+ Net.IEX.Stats: Stats :: String -> Integer -> Double -> Double -> Double -> Double -> Integer -> String -> Double -> Double -> String -> Double -> String -> Integer -> Integer -> Double -> Double -> Integer -> Maybe Double -> Maybe Double -> String -> Integer -> Integer -> Integer -> Integer -> Integer -> Double -> Integer -> Integer -> Double -> Double -> Double -> Maybe Double -> Double -> Double -> Double -> Double -> Double -> Double -> Maybe Double -> Maybe Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> Stats
+ Net.IEX.Stats: [beta] :: Stats -> Double
+ Net.IEX.Stats: [cash] :: Stats -> Integer
+ Net.IEX.Stats: [companyName] :: Stats -> String
+ Net.IEX.Stats: [consensusEPS] :: Stats -> Double
+ Net.IEX.Stats: [day200MovingAvg] :: Stats -> Double
+ Net.IEX.Stats: [day30ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [day50MovingAvg] :: Stats -> Double
+ Net.IEX.Stats: [day5ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [debt] :: Stats -> Integer
+ Net.IEX.Stats: [dividendRate] :: Stats -> Double
+ Net.IEX.Stats: [dividendYield] :: Stats -> Double
+ Net.IEX.Stats: [ebitda] :: Stats -> Integer
+ Net.IEX.Stats: [epsSurpriseDollar] :: Stats -> Maybe Double
+ Net.IEX.Stats: [epsSurprisePercent] :: Stats -> Maybe Double
+ Net.IEX.Stats: [exDividendDate] :: Stats -> String
+ Net.IEX.Stats: [float] :: Stats -> Integer
+ Net.IEX.Stats: [grossProfit] :: Stats -> Integer
+ Net.IEX.Stats: [insiderPercent] :: Stats -> Maybe Double
+ Net.IEX.Stats: [institutionPercent] :: Stats -> Double
+ Net.IEX.Stats: [latestEPSDate] :: Stats -> String
+ Net.IEX.Stats: [latestEPS] :: Stats -> Double
+ Net.IEX.Stats: [marketcap] :: Stats -> Integer
+ Net.IEX.Stats: [month1ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [month3ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [month6ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [numberOfEstimates] :: Stats -> Integer
+ Net.IEX.Stats: [peRatioHigh] :: Stats -> Double
+ Net.IEX.Stats: [peRatioLow] :: Stats -> Double
+ Net.IEX.Stats: [priceToBook] :: Stats -> Double
+ Net.IEX.Stats: [priceToSales] :: Stats -> Double
+ Net.IEX.Stats: [profitMargin] :: Stats -> Double
+ Net.IEX.Stats: [returnOnAssets] :: Stats -> Double
+ Net.IEX.Stats: [returnOnCapital] :: Stats -> Maybe Double
+ Net.IEX.Stats: [returnOnEquity] :: Stats -> Double
+ Net.IEX.Stats: [revenuePerEmployee] :: Stats -> Integer
+ Net.IEX.Stats: [revenuePerShare] :: Stats -> Integer
+ Net.IEX.Stats: [revenue] :: Stats -> Integer
+ Net.IEX.Stats: [sharesOutstanding] :: Stats -> Integer
+ Net.IEX.Stats: [shortDate] :: Stats -> String
+ Net.IEX.Stats: [shortInterest] :: Stats -> Integer
+ Net.IEX.Stats: [shortRatio] :: Stats -> Maybe Double
+ Net.IEX.Stats: [symbol] :: Stats -> String
+ Net.IEX.Stats: [ttmEPS] :: Stats -> Double
+ Net.IEX.Stats: [week52change] :: Stats -> Double
+ Net.IEX.Stats: [week52high] :: Stats -> Double
+ Net.IEX.Stats: [week52low] :: Stats -> Double
+ Net.IEX.Stats: [year1ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [year2ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [year5ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [ytdChangePercent] :: Stats -> Double
+ Net.IEX.Stats: data Stats
+ Net.IEX.Stats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance GHC.Classes.Eq Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance GHC.Generics.Generic Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance GHC.Show.Show Net.IEX.Stats.Stats
+ Net.IEX.TimeSeries: TimeSeries :: String -> Double -> Double -> Double -> Double -> Integer -> Integer -> Double -> Double -> Double -> String -> Double -> TimeSeries
+ Net.IEX.TimeSeries: [changeOverTime] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [changePercent] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [change] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [close] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [date] :: TimeSeries -> String
+ Net.IEX.TimeSeries: [high] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [label] :: TimeSeries -> String
+ Net.IEX.TimeSeries: [low] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [open] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [unadjustedVolume] :: TimeSeries -> Integer
+ Net.IEX.TimeSeries: [volume] :: TimeSeries -> Integer
+ Net.IEX.TimeSeries: [vwap] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: data TimeSeries
+ Net.IEX.TimeSeries: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance GHC.Classes.Eq Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance GHC.Generics.Generic Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance GHC.Show.Show Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.VolumeByVenue: VolumeByVenue :: Integer -> String -> String -> Maybe String -> Double -> Double -> VolumeByVenue
+ Net.IEX.VolumeByVenue: [avgMarketPercent] :: VolumeByVenue -> Double
+ Net.IEX.VolumeByVenue: [date] :: VolumeByVenue -> Maybe String
+ Net.IEX.VolumeByVenue: [marketPercent] :: VolumeByVenue -> Double
+ Net.IEX.VolumeByVenue: [venueName] :: VolumeByVenue -> String
+ Net.IEX.VolumeByVenue: [venue] :: VolumeByVenue -> String
+ Net.IEX.VolumeByVenue: [volume] :: VolumeByVenue -> Integer
+ Net.IEX.VolumeByVenue: data VolumeByVenue
+ Net.IEX.VolumeByVenue: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance GHC.Classes.Eq Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance GHC.Generics.Generic Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance GHC.Show.Show Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.Stocks: Batch :: Maybe [NewsItem] -> Maybe [Chart] -> Maybe Company -> Maybe DelayedQuote -> Maybe [Dividend] -> Maybe Earnings -> Maybe [EffectiveSpread] -> Maybe Financials -> Maybe Stats -> Maybe OHLC -> Maybe Integer -> Maybe Previous -> Maybe Quote -> Maybe [Split] -> Maybe [VolumeByVenue] -> Batch
+ Net.Stocks: ChartQuery :: BatchQuery
+ Net.Stocks: CompanyQuery :: BatchQuery
+ Net.Stocks: DelayedQuoteQuery :: BatchQuery
+ Net.Stocks: DividendQuery :: BatchQuery
+ Net.Stocks: EarningsQuery :: BatchQuery
+ Net.Stocks: EffectiveSpreadQuery :: BatchQuery
+ Net.Stocks: FinancialsQuery :: BatchQuery
+ Net.Stocks: NewsQuery :: BatchQuery
+ Net.Stocks: OHLCQuery :: BatchQuery
+ Net.Stocks: PreviousQuery :: BatchQuery
+ Net.Stocks: PriceTimeQuery :: BatchQuery
+ Net.Stocks: QuoteQuery :: BatchQuery
+ Net.Stocks: SplitQuery :: BatchQuery
+ Net.Stocks: StatsQuery :: BatchQuery
+ Net.Stocks: VolumeByVenueQuery :: BatchQuery
+ Net.Stocks: [chart] :: Batch -> Maybe [Chart]
+ Net.Stocks: [delayedQuote] :: Batch -> Maybe DelayedQuote
+ Net.Stocks: [dividend] :: Batch -> Maybe [Dividend]
+ Net.Stocks: [earnings] :: Batch -> Maybe Earnings
+ Net.Stocks: [effectiveSpread] :: Batch -> Maybe [EffectiveSpread]
+ Net.Stocks: [financials] :: Batch -> Maybe Financials
+ Net.Stocks: [news] :: Batch -> Maybe [NewsItem]
+ Net.Stocks: [ohlc] :: Batch -> Maybe OHLC
+ Net.Stocks: [previous] :: Batch -> Maybe Previous
+ Net.Stocks: [priceTime] :: Batch -> Maybe Integer
+ Net.Stocks: [quote] :: Batch -> Maybe Quote
+ Net.Stocks: [split] :: Batch -> Maybe [Split]
+ Net.Stocks: [stats] :: Batch -> Maybe Stats
+ Net.Stocks: [volumeByVenue] :: Batch -> Maybe [VolumeByVenue]
+ Net.Stocks: data Batch
+ Net.Stocks: data BatchQuery
+ Net.Stocks: getBatch :: [Symbol] -> [BatchQuery] -> IO (Maybe (Map String Batch))
+ Net.Stocks: getBatchCompany :: Symbol -> [BatchQuery] -> IO (Maybe Batch)
+ Net.Stocks: getBook :: Symbol -> IO (Maybe Book)
+ Net.Stocks: getChart :: Symbol -> IO (Maybe [Chart])
+ Net.Stocks: getCompany :: Symbol -> IO (Maybe Company)
+ Net.Stocks: getDelayedDividend :: Symbol -> IO (Maybe [Dividend])
+ Net.Stocks: getDelayedQuote :: Symbol -> IO (Maybe DelayedQuote)
+ Net.Stocks: getEarnings :: Symbol -> IO (Maybe Earnings)
+ Net.Stocks: getEffectiveSpread :: Symbol -> IO (Maybe [EffectiveSpread])
+ Net.Stocks: getFinancials :: Symbol -> IO (Maybe Financials)
+ Net.Stocks: getHistoricalStats :: IO (Maybe [RecentStats])
+ Net.Stocks: getIntraDayStats :: IO (Maybe IntraDayStats)
+ Net.Stocks: getMarket :: IO (Maybe [Market])
+ Net.Stocks: getNewsItem :: Symbol -> IO (Maybe [NewsItem])
+ Net.Stocks: getOHLC :: Symbol -> IO (Maybe OHLC)
+ Net.Stocks: getPeers :: Symbol -> IO ByteString
+ Net.Stocks: getPrevious :: Symbol -> IO (Maybe Previous)
+ Net.Stocks: getPrice :: Symbol -> IO (Maybe Double)
+ Net.Stocks: getQuote :: Symbol -> IO (Maybe Quote)
+ Net.Stocks: getRecentStats :: IO (Maybe [RecentStats])
+ Net.Stocks: getRecordStats :: IO (Maybe RecordStats)
+ Net.Stocks: getRelevant :: Symbol -> IO (Maybe Relevant)
+ Net.Stocks: getSplit :: Symbol -> IO (Maybe [Split])
+ Net.Stocks: getStats :: Symbol -> IO (Maybe Stats)
+ Net.Stocks: getTS :: Symbol -> IO (Maybe [TimeSeries])
+ Net.Stocks: getVolumeByVenue :: Symbol -> IO (Maybe [VolumeByVenue])
+ Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.Batch
+ Net.Stocks: instance Data.Aeson.Types.ToJSON.ToJSON Net.Stocks.Batch
+ Net.Stocks: instance GHC.Classes.Eq Net.Stocks.Batch
+ Net.Stocks: instance GHC.Generics.Generic Net.Stocks.Batch
+ Net.Stocks: instance GHC.Show.Show Net.Stocks.Batch
+ Net.Stocks: typeQuery :: [BatchQuery] -> String
- Net.Stocks: [company] :: Stock -> String
+ Net.Stocks: [company] :: Batch -> Maybe Company

Files

LICENSE view
@@ -1,4 +1,4 @@-Copyright David Bouchare (c) 2018+Copyright David Bouchare, Kristian Sällberg (c) 2018  All rights reserved. 
README.md view
@@ -1,34 +1,43 @@-# stocks  +# stocks  Haskell library for the IEX trading API.   -Example:  +Example:  ```haskell-{-# LANGUAGE RecordWildCards #-}+stack build && stack ghci -import Net.Stocks+> getCompany "aapl" -comp :: String-comp = "AAPL"+Just (Company {symbol = "AAPL",+               companyName = "Apple Inc.",+               exchange = "Nasdaq Global Select",+               industry = "Computer Hardware",+               website = "http://www.apple.com",+               description = "Apple Inc is designs ...",+               ceo = "Timothy D. Cook",+               issueType = "cs",+               sector = "Technology"}) -main :: IO ()-main = do-    resp <- getData comp QueryStocks-    case resp of-        Nothing -> putStrLn "No data for that company"-        Just (Stock{..}) -> do-            putStrLn $ "Stock value: " ++ show latestPrice+> getPrice "dps"++Just 120.36 ``` -Which should show:  +Please see the HUnit test for a complete example+of all API calls. +## How to run test suite ```-Stock value: <the_actual_stock_value>+stack test ``` -### Attribution  +## Contribute++For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/dabcoder/stocks/issues).++### Attribution If you redistribute our API data: -* Cite IEX using the following text and link: “Data provided for free by [IEX](https://iextrading.com/developer).”  +* Cite IEX using the following text and link: “Data provided for free by [IEX](https://iextrading.com/developer).” * Provide a link to https://iextrading.com/api-exhibit-a in your terms of service.
+ Tests/Main.hs view
@@ -0,0 +1,124 @@+module Main where++import Net.IEX.Previous+import Test.HUnit+import Net.Stocks++import qualified Data.ByteString.Lazy.Char8 as L8+import qualified Net.IEX.Stats              as XS++main :: IO Counts+main = runTestTT tests++tests = TestList [TestLabel "" testChart,+                  TestLabel "" testCompany,+                  TestLabel "" testDelayedQuote,+                  TestLabel "" testDelayedDividend,+                  TestLabel "" testEarnings,+                  TestLabel "" testEffectiveSpread,+                  TestLabel "" testFinancials,+                  TestLabel "" testStats,+                  TestLabel "" testNewsItem,+                  TestLabel "" testOHLC,+                  TestLabel "" testPeers,+                  TestLabel "" testPrevious,+                  TestLabel "" testPrice,+                  TestLabel "" testQuote,+                  TestLabel "" testRelevant,+                  TestLabel "" testSplit,+                  TestLabel "" testVolumeByVenue,+                  TestLabel "" testTypeQuery1,+                  TestLabel "" testBatch,+                  TestLabel "" testMultiBatch1,+                  TestLabel "" testMultiBatch2,+                  TestLabel "" testCorrectCompanyName,+                  TestLabel "" testMarket,+                  TestLabel "" testIntraDayStats,+                  TestLabel "" testRecentStats,+                  TestLabel "" testRecordStats,+                  -- TestLabel "" testHistDailyStats+                  TestLabel "" testBook,+                  TestLabel "" testTS+                 ]++testChart = TestCase (do result <- getChart "aapl"+                         assertBool "desc" (result /= Nothing))+testCompany = TestCase (do result <- getCompany "aapl"+                           assertBool "desc" (result /= Nothing))+testDelayedQuote = TestCase (do result <- getDelayedQuote "aapl"+                                assertBool "desc" (result /= Nothing))+testDelayedDividend = TestCase (do result <- getDelayedDividend "aapl"+                                   assertBool "desc" (result /= Nothing))+testEarnings = TestCase (do result <- getEarnings "aapl"+                            assertBool "desc" (result /= Nothing))+testEffectiveSpread = TestCase (do result <- getEffectiveSpread "aapl"+                                   assertBool "desc" (result /= Nothing))+testFinancials = TestCase (do result <- getFinancials "aapl"+                              assertBool "desc" (result /= Nothing))+testStats = TestCase (do result <- getStats "aapl"+                         assertBool "desc" (result /= Nothing))+testNewsItem = TestCase (do result <- getNewsItem "aapl"+                            assertBool "desc" (result /= Nothing))+testOHLC = TestCase (do result <- getOHLC "aapl"+                        assertBool "desc" (result /= Nothing))+testPeers = TestCase+  (do result <- getPeers "aapl"+      assertEqual "get the correct peers for AAPL" result+        (L8.pack "[\"MSFT\",\"NOK\",\"IBM\",\"HPQ\",\"GOOGL\",\"BB\",\"XLK\"]"))+testPrevious = TestCase (do result <- getPrevious "aapl"+                            assertBool "desc" (result /= Nothing))+testPrice = TestCase (do result <- getPrice "aapl"+                         assertBool "" (result /= Nothing))+testQuote = TestCase (do result <- getQuote "aapl"+                         assertBool "desc" (result /= Nothing))+testRelevant = TestCase (do result <- getRelevant "aapl"+                            assertBool "desc" (result /= Nothing))+testSplit = TestCase (do result <- getSplit "aapl"+                         assertBool "desc" (result /= Nothing))+testVolumeByVenue = TestCase (do result <- getVolumeByVenue "aapl"+                                 assertBool "desc" (result /= Nothing))+testTypeQuery1 = TestCase (assertEqual "" "types=news,ohlc"+                           (typeQuery [NewsQuery, OHLCQuery]))+testBatch = TestCase+  (do result <- getBatchCompany "aapl" [StatsQuery, NewsQuery, CompanyQuery]+      assertBool "" (result /= Nothing))++testMultiBatch1 = TestCase+  (do result <- getBatch ["fb"] [OHLCQuery]+      assertBool "" (result /= Nothing))++testMultiBatch2 = TestCase+  (do result <- getBatch ["dps", "fb"] [OHLCQuery, CompanyQuery]+      assertBool "" (result /= Nothing))++-- fail+testCorrectCompanyName = TestCase+   (do result <- getBatchCompany "aapl" [StatsQuery, NewsQuery, CompanyQuery]+       assertEqual "" (pickCompanyName result) "Apple Inc.")++pickCompanyName :: Maybe Batch -> String+pickCompanyName (Just (Batch {stats = st})) = pickCompanyName' st++pickCompanyName' :: Maybe XS.Stats -> String+pickCompanyName' (Just (XS.Stats {XS.companyName = cname})) = cname++testMarket = TestCase (do result <- getMarket+                          assertBool "" (result /= Nothing))++testIntraDayStats = TestCase (do result <- getIntraDayStats+                                 assertBool "" (result /= Nothing))++testRecentStats = TestCase (do result <- getRecentStats+                               assertBool "" (result /= Nothing))++testRecordStats = TestCase (do result <- getRecordStats+                               assertBool "" (result /= Nothing))++testBook = TestCase (do result <- getBook "aapl"+                        assertBool "" (result /= Nothing))++testTS = TestCase (do result <- getTS "aapl"+                      assertBool "" (result /= Nothing))++-- testHistDailyStats = TestCase (do result <- getHistoricalDailyStats+--                                   assertBool "" (result /= Nothing))
+ src/Net/IEX/Book.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Book (Book(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics+import Net.IEX.Quote (Quote)++data Book = Book {+  quote :: Quote,+  bids :: Maybe [Trade], -- FIXME: not sure of this type+  asks :: Maybe [Trade], -- FIXME: not sure of this type+  trades :: [Trade]+} deriving (Generic, Show, Eq)++data Trade = Trade {+  price :: Double,+  size :: Integer,+  tradeId :: Integer,+  isISO :: Bool,+  isOddLot :: Bool,+  isOutsideRegularHours :: Bool,+  isSinglePriceCross :: Bool,+  isTradeThroughExempt :: Bool,+  timestamp :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON Book+instance ToJSON Trade+instance FromJSON Book+instance FromJSON Trade
+ src/Net/IEX/Chart.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Chart (Chart(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Chart = Chart {+  -- is only available on 1d chart.+  minute :: Maybe String,+  -- is only available on 1d chart. 15 minute delayed+  marketAverage :: Maybe Double,+  -- is only available on 1d chart. 15 minute delayed+  marketNotional :: Maybe Double,+  -- is only available on 1d chart. 15 minute delayed+  marketNumberOfTrades :: Maybe Double,+  -- is only available on 1d chart. 15 minute delayed+  marketHigh :: Maybe Double,+  -- is only available on 1d chart. 15 minute delayed+  marketLow :: Maybe Double,+  -- is only available on 1d chart. 15 minute delayed+  marketVolume :: Maybe Double,+  -- is only available on 1d chart. Percent change+  -- of each interval relative to first value. 15 minute delayed+  marketChangeOverTime :: Maybe Double,+  -- is only available on 1d chart.+  average :: Maybe Double,+  -- is only available on 1d chart.+  notional :: Maybe Double,+  -- is only available on 1d chart.+  numberOfTrades :: Maybe Double,+  -- is only available on 1d chart, and only when chartSimplify is true.+  -- The first element is the original number of points.+  -- Second element is how many remain after simplification.+  simplifyFactor :: Maybe [Integer],+  -- is available on all charts.+  high :: Double,+  -- is available on all charts.+  low :: Double,+  -- is available on all charts.+  volume :: Integer,+  -- is available on all charts. A variable formatted version of+  -- the date depending on the range. Optional convienience field.+  label :: String,+  -- is available on all charts. Percent change of each interval+  -- relative to first value. Useful for comparing multiple stocks.+  changeOverTime :: Double,+  -- is not available on 1d chart.+  date :: Maybe String,+  -- is not available on 1d chart.+  open :: Maybe Double,+  -- is not available on 1d chart.+  close :: Maybe Double,+  -- is not available on 1d chart.+  unadjustedVolume :: Maybe Integer,+  -- is not available on 1d chart.+  change :: Maybe Double,+  -- is not available on 1d chart.+  changePercent :: Maybe Double,+  -- is not available on 1d chart.+  vwap :: Maybe Double+} deriving (Generic, Show, Eq)++instance ToJSON Chart+instance FromJSON Chart
+ src/Net/IEX/Company.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Company (Company(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Company = Company {+  symbol :: String,+  companyName :: String,+  exchange :: String,+  industry :: String,+  website :: String,+  description :: String,+  ceo :: String,+  issueType :: String,+  sector :: String+} deriving (Generic, Show, Eq)++customOptionsCompany =+  defaultOptions {+    fieldLabelModifier = let f "ceo" = "CEO"+                             f other = other+                         in f+    }++instance ToJSON Company+instance FromJSON Company where+  parseJSON = genericParseJSON customOptionsCompany
+ src/Net/IEX/DelayedQuote.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.DelayedQuote (DelayedQuote(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data DelayedQuote = DelayedQuote {+  symbol :: String,+  delayedPrice :: Double,+  high :: Double,+  low :: Double,+  delayedSize :: Double,+  delayedPriceTime :: Integer,+  processedTime :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON DelayedQuote+instance FromJSON DelayedQuote
+ src/Net/IEX/Dividend.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Dividend (Dividend(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Dividend = Dividend {+  exDate :: String,+  paymentDate :: String,+  recordDate :: String,+  declaredDate :: String,+  amount :: Double,+  flag :: String,+  dtype :: String,+  qualified :: String,+  indicated :: String+} deriving (Generic, Show, Eq)++customOptionsDividend =+  defaultOptions {+    fieldLabelModifier = let f "dtype" = "type"+                             f other = other+                         in f+    }++instance ToJSON Dividend+instance FromJSON Dividend where+  parseJSON = genericParseJSON customOptionsDividend
+ src/Net/IEX/Earnings.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Earnings (Earning(..),+                         Earnings(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Earning = Earning {+  actualEPS :: Double,+  consensusEPS :: Double,+  estimatedEPS :: Double,+  announceTime :: String,+  numberOfEstimates :: Integer,+  epsSurpriseDollar :: Double,+  epsReportDate :: String,+  fiscalPeriod :: String,+  fiscalEndDate :: String+} deriving (Generic, Show, Eq)++data Earnings = Earnings {+  symbol :: String,+  earnings :: [Earning]+} deriving (Generic, Show, Eq)++customOptionsEarning =+  defaultOptions {+    fieldLabelModifier = let f "epsSurpriseDollar" = "EPSSurpriseDollar"+                             f "epsReportDate"     = "EPSReportDate"+                             f other = other+                         in f+    }++instance ToJSON Earnings+instance ToJSON Earning+instance FromJSON Earnings+instance FromJSON Earning where+  parseJSON = genericParseJSON customOptionsEarning
+ src/Net/IEX/EffectiveSpread.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.EffectiveSpread (EffectiveSpread(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data EffectiveSpread = EffectiveSpread {+  volume :: Integer,+  venue :: String,+  venueName :: String,+  effectiveSpread :: Double,+  effectiveQuoted :: Double,+  priceImprovement :: Double+} deriving (Generic, Show, Eq)++instance ToJSON EffectiveSpread+instance FromJSON EffectiveSpread
+ src/Net/IEX/Financials.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Financials (Financials(..),+                           Financial(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Financial = Financial {+  reportDate :: String,+  grossProfit :: Integer,+  costOfRevenue :: Integer,+  operatingRevenue :: Integer,+  totalRevenue :: Integer,+  operatingIncome :: Integer,+  netIncome :: Integer,+  researchAndDevelopment :: Integer,+  operatingExpense :: Integer,+  currentAssets :: Integer,+  totalAssets :: Integer,+  totalLiabilities :: Maybe Integer,+  currentCash :: Integer,+  currentDebt :: Integer,+  totalCash :: Integer,+  totalDebt :: Integer,+  shareholderEquity :: Integer,+  cashChange :: Integer,+  cashFlow :: Integer,+  operatingGainsLosses :: Maybe String+} deriving (Generic, Show, Eq)++data Financials = Financials {+  symbol :: String,+  financials :: [Financial]+} deriving (Generic, Show, Eq)++instance ToJSON Financial+instance ToJSON Financials+instance FromJSON Financial+instance FromJSON Financials
+ src/Net/IEX/IntraDayStats.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.IntraDayStats (IntraDayStats(..),+                              IntraDaySub(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data IntraDayStats = IntraDayStats {+  volume :: IntraDaySub,+  symbolsTraded :: IntraDaySub,+  routedVolume :: IntraDaySub,+  notional :: IntraDaySub,+  marketShare :: IntraDaySub+} deriving (Generic, Show, Eq)++data IntraDaySub = IntraDaySub {+  value :: Maybe Double,+  lastUpdated :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON IntraDayStats+instance ToJSON IntraDaySub+instance FromJSON IntraDayStats+instance FromJSON IntraDaySub
+ src/Net/IEX/Market.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Market (Market(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Market = Market {+  mic :: String,+  tapeId :: String,+  venueName :: String,+  volume :: Integer,+  tapeA :: Integer,+  tapeB :: Integer,+  tapeC :: Integer,+  marketPercent :: Double,+  lastUpdated :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON Market+instance FromJSON Market
+ src/Net/IEX/NewsItem.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.NewsItem (NewsItem(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data NewsItem = NewsItem {+  datetime :: String,+  headline :: String,+  source :: String,+  url :: String,+  summary :: String,+  related :: String+} deriving (Generic, Show, Eq)++instance ToJSON NewsItem+instance FromJSON NewsItem
+ src/Net/IEX/OHLC.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.OHLC (OHLC(..)) where++import Net.IEX.PriceTime++import Data.Maybe+import Data.Aeson+import GHC.Generics++data OHLC = OHLC {+  open :: PriceTime,+  close :: PriceTime,+  high :: Double,+  low :: Double+} deriving (Generic, Show, Eq)++instance ToJSON OHLC+instance FromJSON OHLC
+ src/Net/IEX/Previous.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Previous (Previous(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Previous = Previous {+  symbol :: String,+  date :: String,+  open :: Double,+  high :: Double,+  low :: Double,+  close :: Double,+  volume :: Integer,+  unadjustedVolume :: Integer,+  change :: Double,+  changePercent :: Double,+  vwap :: Double+} deriving (Generic, Show, Eq)++instance ToJSON Previous+instance FromJSON Previous
+ src/Net/IEX/PriceTime.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.PriceTime (PriceTime(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data PriceTime = PriceTime {+  price :: Double,+  time :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON PriceTime+instance FromJSON PriceTime
+ src/Net/IEX/Quote.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Quote (Quote(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Quote = Quote {+  symbol :: String,+  companyName :: String,+  primaryExchange :: String,+  sector :: String,+  calculationPrice :: String,+  open :: Double,+  openTime :: Integer,+  close :: Double,+  closeTime :: Integer,+  high :: Double,+  low :: Double,+  latestPrice :: Double,+  latestSource :: String,+  latestTime :: String,+  latestUpdate :: Integer,+  latestVolume :: Integer,+  iexRealtimePrice :: Maybe Double,+  iexRealtimeSize :: Maybe Integer,+  iexLastUpdated :: Maybe Integer,+  delayedPrice :: Double,+  delayedPriceTime :: Integer,+  previousClose :: Double,+  change :: Double,+  changePercent :: Double,+  iexMarketPercent :: Maybe Double,+  iexVolume :: Maybe Integer,+  avgTotalVolume :: Integer,+  iexBidPrice :: Maybe Double,+  iexBidSize :: Maybe Integer,+  iexAskPrice :: Maybe Double,+  iexAskSize :: Maybe Integer,+  marketCap :: Integer,+  peRatio :: Double,+  week52High :: Double,+  week52Low :: Double,+  ytdChange :: Double+} deriving (Generic, Show, Eq)++instance ToJSON Quote+instance FromJSON Quote
+ src/Net/IEX/RecentStats.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.RecentStats (RecentStats(..)) where++import Data.Either+import Data.Maybe+import Data.Aeson+import GHC.Generics++data RecentStats = RecentStats {+  date :: String,+  volume :: Integer,+  routedVolume :: Integer,+  marketShare :: Double,+  isHalfday :: Bool,+  litVolume :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON RecentStats+instance FromJSON RecentStats
+ src/Net/IEX/RecordStats.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.RecordStats (RecordStats(..),+                            RecordStatsSub(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data RecordStats = RecordStats {+  volume :: RecordStatsSub,+  symbolsTraded :: RecordStatsSub,+  routedVolume :: RecordStatsSub,+  notional :: RecordStatsSub+} deriving (Generic, Show, Eq)++data RecordStatsSub = RecordStatsSub {+  recordValue :: Double,+  recordDate :: String,+  previousDayValue :: Double,+  avg30Value :: Double+} deriving (Generic, Show, Eq)++instance ToJSON RecordStats+instance ToJSON RecordStatsSub+instance FromJSON RecordStats+instance FromJSON RecordStatsSub
+ src/Net/IEX/Relevant.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Relevant (Relevant(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Relevant = Relevant {+  peers :: Bool,+  symbols :: [String]+} deriving (Generic, Show, Eq)++instance ToJSON Relevant+instance FromJSON Relevant
+ src/Net/IEX/Split.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Split (Split(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Split = Split {+  exDate :: String,+  declaredDate :: String,+  recordDate :: String,+  paymentDate :: String,+  ratio :: Double,+  toFactor :: Integer,+  forFactor :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON Split+instance FromJSON Split
+ src/Net/IEX/Stats.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Stats (Stats (..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Stats = Stats {+  companyName :: String,+  marketcap :: Integer,+  beta :: Double,+  week52high :: Double,+  week52low :: Double,+  week52change :: Double,+  shortInterest :: Integer,+  shortDate :: String,+  dividendRate :: Double,+  dividendYield :: Double,+  exDividendDate :: String,+  latestEPS :: Double,+  latestEPSDate :: String,+  sharesOutstanding :: Integer,+  float :: Integer,+  returnOnEquity :: Double,+  consensusEPS :: Double,+  numberOfEstimates :: Integer,+  epsSurpriseDollar :: Maybe Double,+  epsSurprisePercent :: Maybe Double,+  symbol :: String,+  ebitda :: Integer,+  revenue :: Integer,+  grossProfit :: Integer,+  cash :: Integer,+  debt :: Integer,+  ttmEPS :: Double,+  revenuePerShare :: Integer,+  revenuePerEmployee :: Integer,+  peRatioHigh :: Double,+  peRatioLow :: Double,+  returnOnAssets :: Double,+  returnOnCapital :: Maybe Double,+  profitMargin :: Double,+  priceToSales :: Double,+  priceToBook :: Double,+  day200MovingAvg :: Double,+  day50MovingAvg :: Double,+  institutionPercent :: Double,+  insiderPercent :: Maybe Double,+  shortRatio :: Maybe Double,+  year5ChangePercent :: Double,+  year2ChangePercent :: Double,+  year1ChangePercent :: Double,+  ytdChangePercent :: Double,+  month6ChangePercent :: Double,+  month3ChangePercent :: Double,+  month1ChangePercent :: Double,+  day5ChangePercent :: Double,+  day30ChangePercent :: Double+} deriving (Generic, Show, Eq)++customOptionsStats =+  defaultOptions {+    fieldLabelModifier = let f "epsSurpriseDollar"  = "EPSSurpriseDollar"+                             f "epsSurprisePercent" = "EPSSurprisePercent"+                             f "ebitda"             = "EBITDA"+                             f other = other+                         in f+    }++instance ToJSON Stats+instance FromJSON Stats where+  parseJSON = genericParseJSON customOptionsStats
+ src/Net/IEX/TimeSeries.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.TimeSeries (TimeSeries(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data TimeSeries = TimeSeries {+  date :: String,+  open :: Double,+  high :: Double,+  low :: Double,+  close :: Double,+  volume :: Integer,+  unadjustedVolume :: Integer,+  change :: Double,+  changePercent :: Double,+  vwap :: Double,+  label :: String,+  changeOverTime :: Double+} deriving (Generic, Show, Eq)++instance ToJSON TimeSeries+instance FromJSON TimeSeries
+ src/Net/IEX/VolumeByVenue.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.VolumeByVenue (VolumeByVenue(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data VolumeByVenue = VolumeByVenue {+  volume :: Integer,+  venue :: String,+  venueName :: String,+  date :: Maybe String,+  marketPercent :: Double,+  avgMarketPercent :: Double+} deriving (Generic, Show, Eq)++instance ToJSON VolumeByVenue+instance FromJSON VolumeByVenue
src/Net/Stocks.hs view
@@ -1,106 +1,309 @@ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE TemplateHaskell #-}  module Net.Stocks-        ( Stock(..)-        , Financials(..)-        , FinancialsList(..)-        , QueryType(..)-        , Company-        , stocksQuery-        , financialsQuery-        , peersQuery-        , priceQuery-        , getData-        , getNonJSONData-        ) where-  -import Control.Monad-import Control.Applicative-import Data.Char+       (+         getChart,+         getCompany,+         getBook,+         getDelayedQuote,+         getDelayedDividend,+         getEarnings,+         getEffectiveSpread,+         getFinancials,+         getStats,+         getNewsItem,+         getOHLC,+         getPrevious,+         getPeers,+         getPrice,+         getQuote,+         getRelevant,+         getSplit,+         getVolumeByVenue,+         getTS,+         getBatch,+         getBatchCompany,+         getMarket,+         getIntraDayStats,+         getRecentStats,+         getRecordStats,+         getHistoricalStats,+         -- getHistoricalDailyStats,+         typeQuery,+         Batch (..),+         BatchQuery (..)+       ) where++import System.IO+import GHC.Generics import Data.Aeson-import Data.List.NonEmpty-import Data.ByteString.Lazy.Char8+import Data.Char+import Data.HashMap.Strict+import Data.Maybe import Network.HTTP.Conduit --- | Stock data-data Stock =-    Stock { company          :: String  -- ^ The company's name-          , latestPrice      :: Float   -- ^ Latest stock price-          , latestTime       :: String  -- ^ Timeframe-          , changePercent    :: Float   -- ^ Percentage change-          } deriving (Show)+import qualified Data.ByteString.Lazy.Char8 as L8+import qualified Data.List                  as DL+import qualified Data.Map                   as DM -instance FromJSON Stock where-    parseJSON = withObject "Stock" $ \v -> Stock-        <$> v .: "companyName"-        <*> v .: "latestPrice"-        <*> v .: "latestTime"-        <*> v .: "changePercent"+import qualified Net.IEX.Chart              as IEXChart+import qualified Net.IEX.Company            as IEXCompany+import qualified Net.IEX.Stats              as IEXStats+import qualified Net.IEX.Earnings           as IEXEarnings+import qualified Net.IEX.NewsItem           as IEXNewsItem+import qualified Net.IEX.DelayedQuote       as IEXDelayedQuote+import qualified Net.IEX.Dividend           as IEXDividend+import qualified Net.IEX.EffectiveSpread    as IEXEffectiveSpread+import qualified Net.IEX.Financials         as IEXFinancials+import qualified Net.IEX.OHLC               as IEXOHLC+import qualified Net.IEX.PriceTime          as IEXPriceTime+import qualified Net.IEX.Previous           as IEXPrevious+import qualified Net.IEX.Quote              as IEXQuote+import qualified Net.IEX.Split              as IEXSplit+import qualified Net.IEX.VolumeByVenue      as IEXVolumeByVenue+import qualified Net.IEX.Relevant           as IEXRelevant+import qualified Net.IEX.Market             as IEXMarket+import qualified Net.IEX.IntraDayStats      as IEXIntraDayStats+import qualified Net.IEX.RecentStats        as IEXRecentStats+import qualified Net.IEX.RecordStats        as IEXRecordStats+import qualified Net.IEX.Book               as IEXBook+import qualified Net.IEX.TimeSeries         as IEXTimeSeries -newtype FinancialsList = FinancialsList { financialsList :: NonEmpty Financials}+type Symbol = String -instance FromJSON FinancialsList where-    parseJSON = withObject "FinancialsList" $ \v -> FinancialsList -        <$> v .: "financials"+data BatchQuery =  NewsQuery            |+                   ChartQuery           |+                   CompanyQuery         |+                   DelayedQuoteQuery    |+                   DividendQuery        |+                   EarningsQuery        |+                   EffectiveSpreadQuery |+                   FinancialsQuery      |+                   StatsQuery           |+                   OHLCQuery            |+                   PriceTimeQuery       |+                   PreviousQuery        |+                   QuoteQuery           |+                   SplitQuery           |+                   VolumeByVenueQuery --- | Financials data-data Financials = -    Financials { reportDate       :: String  -- ^ The report's date-               , grossProfit      :: Int     -- ^ Gross Profit-               , costOfRevenue    :: Int     -- ^ Cost of revenue-               , cashFlow         :: Int     -- ^ Cash flow-               } deriving (Show)+batchQueryToStr :: BatchQuery -> String+batchQueryToStr NewsQuery = "news"+batchQueryToStr ChartQuery = "chart"+batchQueryToStr CompanyQuery = "company"+batchQueryToStr DelayedQuoteQuery = "delayedquote"+batchQueryToStr DividendQuery = "dividends"+batchQueryToStr EarningsQuery = "earnings"+batchQueryToStr EffectiveSpreadQuery = "effectivespread"+batchQueryToStr FinancialsQuery = "financials"+batchQueryToStr StatsQuery = "stats"+batchQueryToStr OHLCQuery = "ohlc"+batchQueryToStr PriceTimeQuery = "price"+batchQueryToStr QuoteQuery = "quote"+batchQueryToStr SplitQuery = "split"+batchQueryToStr VolumeByVenueQuery = "volumebyvenue" -instance FromJSON Financials where-    parseJSON = withObject "Financials" $ \v -> Financials-        <$> v .: "reportDate"-        <*> v .: "grossProfit"-        <*> v .: "costOfRevenue"-        <*> v .: "cashFlow"+data Batch = Batch {+  news :: Maybe [IEXNewsItem.NewsItem],+  chart :: Maybe [IEXChart.Chart],+  company :: Maybe IEXCompany.Company,+  delayedQuote :: Maybe IEXDelayedQuote.DelayedQuote,+  dividend :: Maybe [IEXDividend.Dividend],+  earnings :: Maybe IEXEarnings.Earnings,+  effectiveSpread :: Maybe [IEXEffectiveSpread.EffectiveSpread],+  financials :: Maybe IEXFinancials.Financials,+  stats :: Maybe IEXStats.Stats,+  ohlc :: Maybe IEXOHLC.OHLC,+  priceTime :: Maybe Integer,+  previous :: Maybe IEXPrevious.Previous,+  quote :: Maybe IEXQuote.Quote,+  split :: Maybe [IEXSplit.Split],+  volumeByVenue :: Maybe [IEXVolumeByVenue.VolumeByVenue]+} deriving (Generic, Show, Eq) -type Company = String+-- ToJSON means taking a haskell data structure and making a JSON string+instance ToJSON Batch -lowerString :: Company -> String-lowerString str = Prelude.map toLower str+-- FromJSON means parsing the text into a haskell data structure+instance FromJSON Batch  baseURL :: String baseURL = "https://api.iextrading.com/1.0/stock/" -data QueryType = QueryStocks-               | QueryFinancials-               | QueryPeers-               | QueryPrice+marketURL :: String+marketURL = "https://api.iextrading.com/1.0/market" --- builds the URL: /stock/{symbol}/quote-stocksQuery :: Company -> String-stocksQuery company = baseURL ++ lowerString company ++ "/quote"+intraDayURL :: String+intraDayURL = "https://api.iextrading.com/1.0/stats/intraday" --- builds the URL: /stock/{symbol}/financials-financialsQuery :: Company -> String-financialsQuery company = baseURL ++ lowerString company ++ "/financials"+statsURL :: String+statsURL = "https://api.iextrading.com/1.0/stats/" --- builds the URL: /stock/{symbol}/peers-peersQuery :: Company -> String-peersQuery company = baseURL ++ lowerString company ++ "/peers"+lowerString :: Symbol -> String+lowerString = DL.map toLower --- builds the URL: /stock/{symbol}/price-priceQuery :: Company -> String-priceQuery company = baseURL ++ lowerString company ++ "/price"+getChart :: Symbol -> IO (Maybe [IEXChart.Chart])+getChart symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/chart")+  return $ decode obj --- get JSON data -getData :: (FromJSON a) => String -> QueryType -> IO (Maybe a)-getData company qt = do-    obj <- simpleHttp (query qt company)+getCompany :: Symbol -> IO (Maybe IEXCompany.Company)+getCompany symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/company")+  return $ decode obj++getBook :: Symbol -> IO (Maybe IEXBook.Book)+getBook symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/book")+  return $ decode obj++getDelayedQuote :: Symbol -> IO (Maybe IEXDelayedQuote.DelayedQuote)+getDelayedQuote symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/delayed-quote")+  return $ decode obj++getDelayedDividend :: Symbol -> IO (Maybe [IEXDividend.Dividend])+getDelayedDividend symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/dividends/5y")+  return $ decode obj++getEarnings :: Symbol -> IO (Maybe IEXEarnings.Earnings)+getEarnings symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/earnings")+  return $ decode obj++getEffectiveSpread :: Symbol -> IO (Maybe [IEXEffectiveSpread.EffectiveSpread])+getEffectiveSpread symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/effective-spread")+  return $ decode obj++getFinancials :: Symbol -> IO (Maybe IEXFinancials.Financials)+getFinancials symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/financials")+  return $ decode obj++getStats :: Symbol -> IO (Maybe IEXStats.Stats)+getStats symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/stats")+  return $ decode obj++getNewsItem :: Symbol -> IO (Maybe [IEXNewsItem.NewsItem])+getNewsItem symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/news/last/1")+  return $ decode obj++getOHLC :: Symbol -> IO (Maybe IEXOHLC.OHLC)+getOHLC symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/ohlc")+  return $ decode obj++getPeers :: Symbol -> IO L8.ByteString+getPeers symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/peers")+  return $ obj++getPrevious :: Symbol -> IO (Maybe IEXPrevious.Previous)+getPrevious symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/previous")+  return $ decode obj++-- FIXME: do not json parse an int+getPrice :: Symbol -> IO (Maybe Double)+getPrice symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/price")+  return $ decode obj++getQuote :: Symbol -> IO (Maybe IEXQuote.Quote)+getQuote symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/quote")+  return $ decode obj++getRelevant :: Symbol -> IO (Maybe IEXRelevant.Relevant)+getRelevant symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/relevant")+  return $ decode obj++getSplit :: Symbol -> IO (Maybe [IEXSplit.Split])+getSplit symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/splits/5y")+  return $ decode obj++getVolumeByVenue :: Symbol -> IO (Maybe [IEXVolumeByVenue.VolumeByVenue])+getVolumeByVenue symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/volume-by-venue")+  return $ decode obj++getTS :: Symbol -> IO (Maybe [IEXTimeSeries.TimeSeries])+getTS symb = do+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/time-series")+  return $ decode obj++-- get a list of parts we want in a batch request, and translate that+-- to HTTP parameters to provide to the API call+typeQuery :: [BatchQuery] -> String+typeQuery [] = ""+typeQuery inp =+  "types=" ++ (concat $ DL.intersperse "," (fmap batchQueryToStr inp))++symbolQuery :: [Symbol] -> String+symbolQuery [] = ""+symbolQuery inp = "symbols=" ++ (concat $ DL.intersperse "," inp)++questionMark :: [BatchQuery] -> String+questionMark [] = ""+questionMark _  = "?"++getBatch :: [Symbol] -> [BatchQuery] -> IO (Maybe (DM.Map String Batch))+getBatch symbs queryParams =+  let urlPt = baseURL ++ "market/batch?"+      fullQuery = urlPt ++ symbolQuery symbs ++ "&" ++ typeQuery queryParams+  in do+    obj <- getNonJSONData fullQuery     return $ decode obj-  where-    query QueryStocks     = stocksQuery-    query QueryFinancials = financialsQuery --- Get non JSON data-getNonJSONData :: String -> QueryType -> IO ByteString-getNonJSONData company qt = do-    obj <- simpleHttp (query qt company)+-- batch query of a *single* company+getBatchCompany :: Symbol -> [BatchQuery] -> IO (Maybe Batch)+getBatchCompany symb queryParams =+  let urlPt = (baseURL ++ lowerString symb ++ "/batch/")+      fullQuery = urlPt ++ (questionMark queryParams) ++ (typeQuery queryParams)+  in do+    obj <- getNonJSONData fullQuery+    return $ decode obj++getMarket :: IO (Maybe [IEXMarket.Market])+getMarket = do+    obj <- getNonJSONData marketURL+    return $ decode obj++getIntraDayStats :: IO (Maybe IEXIntraDayStats.IntraDayStats)+getIntraDayStats = do+    obj <- getNonJSONData intraDayURL+    return $ decode obj++getRecentStats :: IO (Maybe [IEXRecentStats.RecentStats])+getRecentStats = do+    obj <- getNonJSONData (statsURL ++ "recent")+    return $ decode obj++getRecordStats :: IO (Maybe IEXRecordStats.RecordStats)+getRecordStats = do+    obj <- getNonJSONData (statsURL ++ "records")+    return $ decode obj++getHistoricalStats :: IO (Maybe [IEXRecentStats.RecentStats])+getHistoricalStats = undefined++-- currently does not work due to inconsitency in+-- IEX API. isHalfDay is Bool in one API call and Int in another++-- getHistoricalDailyStats :: IO (Maybe [IEXRecentStats.RecentStats])+-- getHistoricalDailyStats = do+--     obj <- getNonJSONData (statsURL ++ "historical/daily")+--     return $ decode obj++getNonJSONData :: String -> IO L8.ByteString+getNonJSONData query = do+    obj <- simpleHttp query     return obj-  where-    query QueryPeers = peersQuery-    query QueryPrice = priceQuery
stocks.cabal view
@@ -1,30 +1,49 @@ name:                stocks-version:             0.1.0.0+version:             0.2.0.0 synopsis:            Library for the IEX Trading API description:         Simple library for interacting with the IEX Trading API-homepage:            https://github.com/dabcoder/stocks#readme+homepage:            https://github.com/dabcoder/stocks license:             BSD3 license-file:        LICENSE-author:              David Bouchare-maintainer:          David Bouchare-copyright:           2018 David Bouchare+author:              David Bouchare, Kristian Sällberg+maintainer:          David Bouchare, Kristian Sällberg+copyright:           2018 David Bouchare, Kristian Sällberg category:            Net build-type:          Simple cabal-version:       >=1.10 extra-source-files:  README.md-  + library-  exposed-modules:     Net.Stocks-  -- other-modules:-  -- other-extensions:+  exposed-modules: Net.Stocks, Net.IEX.Stats,+                   Net.IEX.Chart, Net.IEX.Company,+                   Net.IEX.Earnings, Net.IEX.DelayedQuote,+                   Net.IEX.Dividend, Net.IEX.EffectiveSpread,+                   Net.IEX.Financials, Net.IEX.NewsItem,+                   Net.IEX.OHLC, Net.IEX.Previous,+                   Net.IEX.PriceTime, Net.IEX.Quote,+                   Net.IEX.Relevant, Net.IEX.Split,+                   Net.IEX.VolumeByVenue, Net.IEX.Market,+                   Net.IEX.IntraDayStats, Net.IEX.RecentStats,+                   Net.IEX.RecordStats, Net.IEX.Book, Net.IEX.TimeSeries   build-depends: base == 4.*                , http-conduit                , aeson >= 0.8.0                , bytestring+               , containers+               , unordered-containers                , semigroups >= 0.18-  hs-source-dirs:      src-  default-language:    Haskell2010+  hs-source-dirs: src+  default-language: Haskell2010  source-repository head   type:     git   location: https://github.com/dabcoder/stocks.git++Test-Suite test-hspec+  type:              exitcode-stdio-1.0+  main-is:           Tests/Main.hs+  build-depends:     base,+                     stocks,+                     bytestring,+                     HUnit+  default-language:  Haskell2010