1 module Cryptsy
.API
.Public
.Order
3 , withComponents
, withText
4 -- |Re-exported from Data.Text
6 -- |Re-exported from Data.Aeson
7 , Value
, Object
, FromJSON
(..)
8 -- |Re-exported from Data.Aeson.Types
14 import Control
.Applicative
((<$>), (<*>))
17 import Data
.Text
(Text
, pack
)
20 import qualified Data
.Aeson
as Aeson
21 import Data
.Aeson
(FromJSON
(..), Value
, Object
, withObject
, (.:))
22 import Data
.Aeson
.Types
(Parser
)
24 data GOrder p q t
= Order
29 type Order
= GOrder Text Text Text
31 instance (FromJSON p
, FromJSON q
, FromJSON t
) =>
32 FromJSON
(GOrder p q t
)
34 parseJSON
= withObject
"order"
35 $ withComponents parseJSON parseJSON parseJSON
37 -- Combine component parsers into JSON Object parser, for use with
38 -- 'Aeson.withObject'.
39 withComponents
:: (Value
-> Parser p
) -- ^ price parser
40 -> (Value
-> Parser q
) -- ^ quantity parser
41 -> (Value
-> Parser t
) -- ^ total parser
42 -> Object
-> Parser
(GOrder p q t
)
43 withComponents parsePrice parseQuantity parseTotal o
=
45 (o
.: pack
"price" >>= parsePrice
) <*>
46 (o
.: pack
"quantity" >>= parseQuantity
) <*>
47 (o
.: pack
"total" >>= parseTotal
)
49 -- Special from of withComponents, since API delivers components as JSON
51 withText
:: (Text
-> Parser p
) -- ^ price parser
52 -> (Text
-> Parser q
) -- ^ quantity parser
53 -> (Text
-> Parser t
) -- ^ total parser
54 -> Object
-> Parser
(GOrder p q t
)
55 withText parsePrice parseQuantity parseTotal
=
57 (Aeson
.withText
"price" parsePrice
)
58 (Aeson
.withText
"quantity" parseQuantity
)
59 (Aeson
.withText
"total" parseTotal
)