1 module Cryptsy
.API
.Public
.Trade
3 , withComponents
, withText
8 import Control
.Applicative
((<$>), (<*>))
11 import Data
.Text
(Text
, pack
)
14 import qualified Data
.Aeson
as Aeson
16 ( FromJSON
(..), Value
, Object
, withObject
, (.:)
18 import Data
.Aeson
.Types
(Parser
)
20 data GTrade dt p q t
= Trade
27 type Trade
= GTrade Text Text Text Text
29 instance (FromJSON dt
, FromJSON p
, FromJSON q
, FromJSON t
) =>
30 FromJSON
(GTrade dt p q t
)
32 parseJSON
= withObject
"trade"
33 $ withComponents parseJSON parseJSON parseJSON parseJSON
35 -- Combine component parsers into JSON Object parser, for use with
36 -- 'Aeson.withObject'.
37 withComponents
:: (Value
-> Parser dt
) -- ^ date/time parser
38 -> (Value
-> Parser p
) -- ^ price parser
39 -> (Value
-> Parser q
) -- ^ quantity parser
40 -> (Value
-> Parser t
) -- ^ total parser
41 -> Object
-> Parser
(GTrade dt p q t
)
42 withComponents parseDatetime parsePrice parseQuantity parseTotal o
=
45 (o
.: pack
"time" >>= parseDatetime
) <*>
46 (o
.: pack
"price" >>= parsePrice
) <*>
47 (o
.: pack
"quantity" >>= parseQuantity
) <*>
48 (o
.: pack
"total" >>= parseTotal
)
50 -- Special from of 'withComponents', since API delivers components as JSON
52 withText
:: (Text
-> Parser dt
) -- ^ date/time parser
53 -> (Text
-> Parser p
) -- ^ price parser
54 -> (Text
-> Parser q
) -- ^ quantity parser
55 -> (Text
-> Parser t
) -- ^ total parser
56 -> Object
-> Parser
(GTrade dt p q t
)
57 withText parseDatetime parsePrice parseQuantity parseTotal
=
59 (Aeson
.withText
"time" parseDatetime
)
60 (Aeson
.withText
"price" parsePrice
)
61 (Aeson
.withText
"quantity" parseQuantity
)
62 (Aeson
.withText
"total" parseTotal
)