1 module Cryptsy
.API
.Public
.SingleMarket
2 ( GSingleMarket
(..), SingleMarket
3 , withComponents
, withText
4 , module Cryptsy
.API
.Public
.Order
5 , module Cryptsy
.API
.Public
.Trade
6 -- |Re-exported from Data.Text
8 -- |Re-exported from Data.Aeson
9 , Value
, Object
, FromJSON
(..)
10 -- |Re-exported from Data.Aeson.Types
16 import Control
.Applicative
((<$>), (<*>))
17 import Control
.Monad
((>>=))
18 import Data
.Function
((.), ($))
19 import Data
.Traversable
(mapM)
21 import Text
.Show (Show)
24 import Data
.Text
(Text
, pack
)
27 import qualified Data
.Aeson
as Aeson
29 ( FromJSON
(..), Value
, Object
, withObject
, withArray
, (.:)
31 import Data
.Aeson
.Types
(Parser
)
34 import Data
.Vector
(Vector
)
37 import Cryptsy
.API
.Public
.Order
(GOrder
(Order
))
38 import qualified Cryptsy
.API
.Public
.Order
as Order
39 import Cryptsy
.API
.Public
.Trade
(GTrade
(Trade
, time
))
40 import qualified Cryptsy
.API
.Public
.Trade
as Trade
42 data GSingleMarket p q dt t
= SingleMarket
50 , secondaryname
:: Text
51 , secondarycode
:: Text
52 , recenttrades
:: Vector
(GTrade dt p q t
)
53 , sellorders
:: Vector
(GOrder p q t
)
54 , buyorders
:: Vector
(GOrder p q t
)
56 type SingleMarket
= GSingleMarket Text Text Text Text
58 instance (FromJSON p
, FromJSON q
, FromJSON dt
, FromJSON t
) =>
59 FromJSON
(GSingleMarket p q dt t
)
61 parseJSON
= withObject
"market"
62 $ withComponents parseJSON parseJSON parseJSON parseJSON
64 -- Combine component parsers into JSON Object parser, for use with
65 -- 'Aeson.withObject'.
66 withComponents
:: (Value
-> Parser p
) -- ^ price parser
67 -> (Value
-> Parser q
) -- ^ quantity parser
68 -> (Value
-> Parser dt
) -- ^ date/time parser
69 -> (Value
-> Parser t
) -- ^ total parser
70 -> Object
-> Parser
(GSingleMarket p q dt t
)
71 withComponents parsePrice parseQuantity parseDatetime parseTotal
=
81 withArray
"trades" . mapM . withObject
"trade"
82 $ Trade
.withComponents
87 parseOrders
= withArray
"orders" . mapM . withObject
"order"
88 $ Order
.withComponents parsePrice parseQuantity parseTotal
90 -- Special from of withComponents, since API delivers components as JSON
92 withText
:: (Text
-> Parser p
) -- ^ price parser
93 -> (Text
-> Parser q
) -- ^ quantity parser
94 -> (Text
-> Parser dt
) -- ^ date/time parser
95 -> (Text
-> Parser t
) -- ^ total parser
96 -> Object
-> Parser
(GSingleMarket p q dt t
)
97 withText parsePrice parseQuantity parseDatetime parseTotal
= withAllComponents
105 parseLastTradePrice
= Aeson
.withText
"lasttradeprice" parsePrice
106 parseVolume
= Aeson
.withText
"volume" parseQuantity
107 parseLastTradeTime
= Aeson
.withText
"lasttradetime" parseDatetime
109 withArray
"recenttrades" . mapM . withObject
"trade"
115 parseSellOrders
= withArray
"sellorders" $ mapM parseOrder
116 parseBuyOrders
= withArray
"buyorders" $ mapM parseOrder
119 $ Order
.withText parsePrice parseQuantity parseTotal
121 withAllComponents
:: (Value
-> Parser p
)
122 -> (Value
-> Parser q
)
123 -> (Value
-> Parser dt
)
124 -> (Value
-> Parser
(Vector
(GTrade dt p q t
)))
125 -> (Value
-> Parser
(Vector
(GOrder p q t
)))
126 -> (Value
-> Parser
(Vector
(GOrder p q t
)))
127 -> Object
-> Parser
(GSingleMarket p q dt t
)
128 withAllComponents pltp pv pltt prt pso pbo o
=
130 o
.: pack
"marketid" <*>
131 o
.: pack
"label" <*>
132 (o
.: pack
"lasttradeprice" >>= pltp
) <*>
133 (o
.: pack
"volume" >>= pv
) <*>
134 (o
.: pack
"lasttradetime" >>= pltt
) <*>
135 o
.: pack
"primaryname" <*>
136 o
.: pack
"primarycode" <*>
137 o
.: pack
"secondaryname" <*>
138 o
.: pack
"secondarycode" <*>
139 (o
.: pack
"recenttrades" >>= prt
) <*>
140 (o
.: pack
"sellorders" >>= pso
) <*>
141 (o
.: pack
"buyorders" >>= pbo
)