Achieve 100% haddock coverage; do not inline CAFs that should be shared.
[haskell-cryptsy-api.git] / src / Cryptsy / API / Public / Types / Order.hs
blob42b23bb9bfc3108bfd2f0687dd0c7a86f1ee9a2a
1 -- |Type for individual orders (order book entries) from the API.
2 module Cryptsy.API.Public.Types.Order
3 ( module Cryptsy.API.Public.Types.Order
4 , module Cryptsy.API.Public.Types.Num
6 where
8 -- base
9 import Control.Applicative ((<$>), (<*>))
11 -- text
12 import Data.Text (pack)
14 -- aeson
15 import Data.Aeson (FromJSON(..), Value, withObject, (.:))
16 import Data.Aeson.Types (Parser)
18 -- this package
19 import Cryptsy.API.Public.Types.Num
21 -- |generalized order
22 data GOrder p q t = Order
23 { orderPrice :: p
24 , orderQuantity :: q
25 , orderTotal :: t
26 } deriving Show
28 -- |default order
29 type Order = GOrder CryptsyNum CryptsyNum CryptsyNum
31 instance (FromJSON p, FromJSON q, FromJSON t) =>
32 FromJSON (GOrder p q t)
33 where
34 parseJSON = parseOrder parseJSON parseJSON parseJSON
36 -- |Combine component parsers into JSON Object parser.
37 parseOrder :: (Value -> Parser p) -- ^ price parser
38 -> (Value -> Parser q) -- ^ quantity parser
39 -> (Value -> Parser t) -- ^ total parser
40 -> Value -> Parser (GOrder p q t)
41 parseOrder parsePrice parseQuantity parseTotal =
42 withObject "Order" $ \o -> Order <$>
43 (o .: pack "price" >>= parsePrice ) <*>
44 (o .: pack "quantity" >>= parseQuantity) <*>
45 (o .: pack "total" >>= parseTotal )