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
9 -- |Re-exported from Data.Aeson
10 , Value
, Object
, FromJSON
(..)
11 -- |Re-exported from Data.Aeson.Types
17 import Data
.Aeson
( FromJSON
(..), Value
(Object
), Object
, withObject
)
18 import Data
.Aeson
.Types
(Parser
, Result
(..), parse
)
21 import Data
.Function
( ($) )
22 import Data
.Functor
( fmap, (<$>) )
23 import Data
.Maybe (Maybe(..))
24 import Data
.Traversable
(mapM)
25 import Prelude
( Show, String )
28 import Control
.Monad
.Trans
.Either (left
, right
)
31 import Data
.Text
(Text
, pack
)
33 -- unordered-containers
34 import Data
.HashMap
.Strict
(HashMap
)
35 import qualified Data
.HashMap
.Strict
as HM
(lookup)
38 import Cryptsy
.API
.Public
39 import Cryptsy
.API
.Public
.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
)) }
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
)
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
)
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
76 marketsKey
= pack
"markets"
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
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