blob: 67243c937c5a5dc6cd139954a7d66512dd147bea (
plain) (
blame)
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
|
discard """
action: run
"""
import math, random, strutils
const consolePrefix = "jsCallbacks"
asm """
var callback = []
function regCallback (fn) { callback.push (fn); }
function runCallbacks () {
var result = "\n"
var n = 0
for (var fn in callback) {
n += 1
result += "("+String (n)+")"
result += callback [fn] ()
result += "\n"
}
return result
}
function print (text) { console.log (text); }
"""
proc consoleprint (str:cstring): void {.importc: "print", noDecl.}
proc print* (a: varargs[string, `$`]) = consoleprint "$1: $2" % [consolePrefix, join(a, " ")]
type CallbackProc {.importc.} = proc () : cstring
proc regCallback (fn:CallbackProc) {.importc.}
proc runCallbacks ():cstring {.importc.}
proc `*` (s:string, n:Natural) : string = s.repeat(n)
proc outer (i:Natural) : (string, int) =
let c = $char(random(93) + 33)
let n = random(40)
let s = c * n
proc inner(): cstring = ("[$1]" % $n) & s & " <--"
regCallback(inner)
return (s, n)
var expected = "\n"
for i in 1 .. 10:
let (s, n) = outer(i)
expected &= ("($1)[$2]" % [$i, $n]) & s & " <--"
expected &= "\n"
let results = runCallbacks()
doAssert(expected == results)
|