forked from cryptobuks1/JsWallet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathload-rates.ls
More file actions
75 lines (75 loc) · 2.27 KB
/
Copy pathload-rates.ls
File metadata and controls
75 lines (75 loc) · 2.27 KB
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
require! {
\../web3t/providers/superagent.ls : { get }
\prelude-ls : { map, group-by, obj-to-pairs, pairs-to-obj, flatten, filter }
\./workflow.ls : { task, run }
\./math.ls : { div }
}
parse-rate-string = (usd-info)->
[_, div, url, extract] = usd-info.match(/(1\/)?url\(([^)]+)\)(.+)?/)
{ div, url, extract }
parse-usd-info = (val)->
switch typeof! val
case \Object then val
case \String then parse-rate-string val
case \Number then { val }
else val: 0
make-loader = (wallet)->
{ usd-info, token } = wallet.coin
info = parse-usd-info usd-info
{ token, ...info }
invalid-url = (url)->
return yes if typeof! url isnt \String
return yes if url.index-of(\http) isnt 0
no
create-task = ([url, items])->
exec = task (cb)->
return cb { items } if invalid-url url
err, data <- get url .end
cb { err, data, items }
[url, exec]
extract-val = (data, [head, ...tail])->
return data if data? and not head? and (tail.length is 0 or not tail?)
return ".." if not data? and (tail.length is 0 or not tail?)
extract-val data[head], tail
modify-item = (data, item)-->
res =
| data?body? => extract-val data.body, item.extract.split('.').splice(1)
| _ => ".."
val =
| item.div is "1/" => 1 `div` res
| _ => res
{ val, item.extract, item.token }
set-val = (info)->
[url, { err, data, items }] = info
return info if invalid-url url
return null if err?
modified-items =
items |> map modify-item data
[url, { items: modified-items }]
set-vals = (res, cb)->
item =
res |> obj-to-pairs
|> map set-val
|> filter -> it?
|> map -> it.1.items
|> flatten
|> map -> [it.token, it.val]
|> pairs-to-obj
cb null, item
get-data = (wallets, cb)->
tasks =
wallets
|> map make-loader
|> group-by (.url)
|> obj-to-pairs
|> map create-task
|> pairs-to-obj
res <- run [tasks] .then
set-vals res, cb
load-rates = (store, cb)->
{ wallets } = store.current.account
err, rates <- get-data wallets
return cb err if err?
store.rates = rates
cb null
module.exports = load-rates