{-# LANGUAGE OverloadedStrings #-} module ZaifExchangeAPI.Type ( ApiName , Chart (..) , Api (..) , tshow , JLastPrice (..) , JTicker (..) , JTrade (..) , JTradeList (..) , JDepth (..) ) where import Control.Applicative ((<$>), (<*>), empty) import Data.Aeson (FromJSON(..), Value(..), (.:)) import qualified Data.Text.Lazy as L (Text) type ApiName = L.Text data Chart = BtcJpy | MonaJpy | MonaBtc data Api = LastPrice | Ticker | Trades | Depth class TShow a where tshow :: a -> ApiName instance TShow Chart where tshow BtcJpy = "btc_jpy" tshow MonaJpy = "mona_jpy" tshow MonaBtc = "mona_btc" instance TShow Api where tshow LastPrice = "last_price" tshow Ticker = "ticker" tshow Trades = "trades" tshow Depth = "depth" data JLastPrice = JLastPrice { lastprice :: Double } deriving Show data JTicker = JTicker { last :: Double , high :: Double , low :: Double , vwap :: Double , volume :: Double , bid :: Double , ask :: Double } deriving Show data JTrade = JTrade { date :: Int , price :: Double , amount :: Double , tid :: Int , currencypair :: L.Text , tradetype :: L.Text } deriving Show newtype JTradeList = JTradeList [JTrade] instance Show JTradeList where show (JTradeList trades) = show trades data JDepth = JDepth { asks :: [[Double]], bids :: [[Double]] } deriving Show instance FromJSON JLastPrice where parseJSON (Object v) = JLastPrice <$> v .: "last_price" parseJSON _ = empty instance FromJSON JTicker where parseJSON (Object v) = JTicker <$> v .: "last" <*> v .: "high" <*> v .: "low" <*> v .: "vwap" <*> v .: "volume" <*> v .: "bid" <*> v .: "ask" parseJSON _ = empty instance FromJSON JTradeList where parseJSON obj = JTradeList <$> parseJSON obj instance FromJSON JTrade where parseJSON (Object v) = JTrade <$> v .: "date" <*> v .: "price" <*> v .: "amount" <*> v .: "tid" <*> v .: "currency_pair" <*> v .: "trade_type" parseJSON _ = empty instance FromJSON JDepth where parseJSON (Object v) = JDepth <$> v .: "asks" <*> v .: "bids" parseJSON _ = empty