Massive refactoring into smaller modules.
[haskell-cryptsy-api.git] / Cryptsy / API / Public / Trade.hs
blob4f6fb283145aed1590a4b6fd358bb91c6badc5f7
1 module Cryptsy.API.Public.Trade
2 ( GTrade(..), Trade
3 , withComponents, withText
5 where
7 -- base
8 import Control.Applicative ((<$>), (<*>))
10 -- text
11 import Data.Text (Text, pack)
13 -- aeson
14 import qualified Data.Aeson as Aeson
15 import Data.Aeson
16 ( FromJSON(..), Value, Object, withObject, (.:)
18 import Data.Aeson.Types (Parser)
20 data GTrade dt p q t = Trade
21 { id :: Text
22 , time :: dt
23 , price :: p
24 , quantity :: q
25 , total :: t
26 } deriving Show
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)
31 where
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 =
43 Trade <$>
44 o .: pack "id" <*>
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
51 -- Strings.
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 =
58 withComponents
59 (Aeson.withText "time" parseDatetime)
60 (Aeson.withText "price" parsePrice )
61 (Aeson.withText "quantity" parseQuantity)
62 (Aeson.withText "total" parseTotal )