-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinheritance-types.hs
127 lines (78 loc) · 3.69 KB
/
inheritance-types.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
module Main where
import qualified Data.Map as Map
-- import JsonParser
-- parse :: String -> Jvalue
data Jvalue = Jobject (Map.Map String Jvalue)
| Jarray [Jvalue]
| Jstring String
| Jnumber Double
| Jbool Bool
| Jnull
deriving Show
-- Order type
newtype Volume = Volume Double deriving (Show)
newtype Price = Price Double deriving (Show)
class Order a where
makeOrder :: String -> String -> a
data Ask = Ask {aprice::Price, avolume::Volume} deriving (Show)
instance Order Ask where
makeOrder = makeAsk
data Bid = Bid {bprice::Price, bvolume::Volume} deriving (Show)
instance Order Bid where
makeOrder = makeBid
data OrderBook = OrderBook{ bids::[Bid] , asks::[Ask] } deriving (Show)
--------------------------------------------------------------------------------
-- I need functions to convert parsed responses of type Jvalue to type OrderBook
--------------------------------------------------------------------------------
--------------helper functions------------------
getString :: Jvalue -> Maybe String
getString (Jstring str) = return str
getString _ = Nothing
getNumber :: Jvalue -> Maybe Double
getNumber (Jnumber num) = return num
getNumber _ = Nothing
------------------------------------------------
convertBitstamp :: Jvalue -> Maybe OrderBook
convertBitstamp (Jobject dict) = do
Jarray jasks <- Map.lookup "asks" dict
Jarray jbids <- Map.lookup "bids" dict
as <- (getOrders jasks :: Maybe [Ask])
bs <- (getOrders jbids :: Maybe [Bid])
return (OrderBook {bids=bs, asks=as})
convertBitstamp _ = Nothing
getOrders :: Order a => [Jvalue] -> Maybe [a]
getOrders [] = return []
getOrders (jx:jxs) = do -- this is just a "for each" loop
order <- convertAnOrder jx
orders <- getOrders jxs
return (order : orders)
convertAnOrder :: Order a => Jvalue -> Maybe a
convertAnOrder (Jarray [jprice, jvol]) = do
sprice <- getString jprice
svol <- getString jvol
return (makeOrder sprice svol)
convertAnAsk _ = Nothing
-----------eliminate this block-----------------
------------ the end of the chain --------------
makeBid :: String -> String -> Bid
makeBid price vol = Bid {bprice = Price (read price :: Double), bvolume = Volume (read vol :: Double)}
makeAsk :: String -> String -> Ask
makeAsk price vol = Ask {aprice = Price (read price :: Double), avolume = Volume (read vol :: Double)}
------------------------------------------------
------------------------------------------------
main = do
-- l <- getContents
-- print $ convertBitstamp $ parse l
-- l <- getContents
let response = Jobject(
Map.fromList([
("asks", Jarray [
Jarray [ Jstring "430", Jstring "1.2"],
Jarray [ Jstring "431", Jstring "0.5"]
]),
("bids", Jarray [
Jarray [ Jstring "420", Jstring "3" ],
Jarray [ Jstring "419", Jstring "5" ]
])
]))
print $ convertBitstamp $ response