Substitute "SingleMarket" -> "Market"
[haskell-cryptsy-api.git] / Cryptsy / API / Public / MarketData / New.hs
blob0310d06de471eab5ce8384ca42ddfd61576a9d10
1 {-# LANGUAGE ViewPatterns #-}
2 module Cryptsy.API.Public.MarketData.New
3 ( GMarketData(..), MarketData
4 , withComponents, withMarket
5 , getMarketData, marketData
6 , module Cryptsy.API.Public.Market
7 -- |Re-exported from Data.Text
8 , Text
9 -- |Re-exported from Data.Aeson
10 , Value, Object, FromJSON(..)
11 -- |Re-exported from Data.Aeson.Types
12 , Parser
14 where
16 -- aeson
17 import Data.Aeson ( FromJSON(..), Value(Object), Object, withObject )
18 import Data.Aeson.Types (Parser, Result(..), parse)
20 -- base
21 import Data.Function ( ($) )
22 import Data.Functor ( fmap, (<$>) )
23 import Data.Maybe (Maybe(..))
24 import Data.Traversable (mapM)
25 import Prelude ( Show, String )
27 -- either
28 import Control.Monad.Trans.Either (left, right)
30 -- text
31 import Data.Text (Text, pack)
33 -- unordered-containers
34 import Data.HashMap.Strict (HashMap)
35 import qualified Data.HashMap.Strict as HM (lookup)
37 -- this pacakge
38 import Cryptsy.API.Public
39 import Cryptsy.API.Public.Market
40 ( GMarket(..), Market
41 , GOrder(Order) -- for re-export
42 , GTrade(Trade, time) -- for re-export
45 marketdatav2URL :: String
46 marketdatav2URL = "http://pubapi.cryptsy.com/api.php?method=marketdatav2"
48 newtype GMarketData p q dt t =
49 MarketData { markets :: (HashMap Text (GMarket p q dt t)) }
50 deriving Show
51 type MarketData = GMarketData Text Text Text Text
53 instance (FromJSON p, FromJSON q, FromJSON dt, FromJSON t) =>
54 FromJSON (GMarketData p q dt t)
55 where
56 parseJSON = withObject "markets" $ withComponents parseJSON
58 -- |Build parser for multiple markets from parser for single market.
59 withComponents :: (Value -> Parser (GMarket p q dt t)) -- ^ market parser
60 -> Object -> Parser (GMarketData p q dt t)
61 withComponents parseMarket = fmap MarketData <$> mapM parseMarket
63 -- |Build parser for multiple markets from parser for single market object.
64 withMarket :: (Object -> Parser (GMarket p q dt t)) -- ^ market parser
65 -> Object -> Parser (GMarketData p q dt t)
66 withMarket parseMarket = withComponents (withObject "market" parseMarket)
68 {-|
69 "Raw" request, does not convert the JSON value, but simply returns the JSON
70 value bound to the "return" key from the response body.
72 getMarketData :: PubCryptsy Value
73 getMarketData = pubCryptsy marketdatav2URL
75 marketsKey :: Text
76 marketsKey = pack "markets"
78 {-|
79 "Cooked" request, extracts the JSON object bound to the "market" key of the
80 object boudn to the "return" key and converts it.
82 marketData :: (Object -> Parser (GMarketData p q dt t)) -- ^ market data parser
83 -> PubCryptsy (GMarketData p q dt t)
84 marketData parseMarkets = do
85 ret <- getMarketData
86 mkts <- case ret of
87 Object (HM.lookup marketsKey -> Just m) -> right m
88 _ -> left $ FailParseReturn ret "Missing 'markets' key."
89 case parse (withObject "markets" parseMarkets) mkts of
90 Error err -> left $ FailParseReturn ret err
91 Success v -> right v