-
Notifications
You must be signed in to change notification settings - Fork 0
/
inheritance-meetup.hs
127 lines (72 loc) · 3.44 KB
/
inheritance-meetup.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)
data Order = Order {price::Price, volume::Volume} deriving (Show)
newtype Bid = Bid Order deriving Show
newtype Ask = Ask Order deriving Show
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
bs <- getOrders jbids
return (OrderBook {bids=map Bid bs, asks=map Ask as})
convertBitstamp _ = Nothing
getOrders :: [Jvalue] -> Maybe [Order]
getOrders [] = return []
getOrders (jx:jxs) = do -- this is just a "for each" loop
ask <- convertAnOrder jx
asks <- getOrders jxs
return (ask : asks)
-- getAsks jxs = sequence (map convertAnOrder jxs)
convertAnOrder :: Jvalue -> Maybe Order
convertAnOrder (Jarray [jprice, jvol]) = do
sprice <- getString jprice
svol <- getString jvol
return (makeOrder sprice svol)
convertAnOrder _ = Nothing
-----------eliminate this block-----------------
------------ the end of the chain --------------
makeOrder :: String -> String -> Order
makeOrder price vol = Order {price = Price (read price :: Double), volume = 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