Manage imports.
[haskell-cryptsy-api.git] / Cryptsy / API / Public / Order.hs
blob4fc6fb396f3b8b5aae9e8487b17533ee1c3ace4f
1 module Cryptsy.API.Public.Order
2 ( GOrder(..), Order
3 , withComponents, withText
4 -- |Re-exported from Data.Text
5 , Text
6 -- |Re-exported from Data.Aeson
7 , Value, Object, FromJSON(..)
8 -- |Re-exported from Data.Aeson.Types
9 , Parser
11 where
13 -- base
14 import Control.Applicative ((<$>), (<*>))
16 -- text
17 import Data.Text (Text, pack)
19 -- aeson
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
25 { price :: p
26 , quantity :: q
27 , total :: t
28 } deriving Show
29 type Order = GOrder Text Text Text
31 instance (FromJSON p, FromJSON q, FromJSON t) =>
32 FromJSON (GOrder p q t)
33 where
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 =
44 Order <$>
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
50 -- Strings.
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 =
56 withComponents
57 (Aeson.withText "price" parsePrice )
58 (Aeson.withText "quantity" parseQuantity)
59 (Aeson.withText "total" parseTotal )