summary refs log tree commit diff stats
path: root/tests/async/tfuturestream.nim
blob: b5772d5ac863241611fcdf41b84f3c55ed510672 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
discard """
output: '''
0
1
2
3
4
5
Done
Finished
'''
"""
import asyncdispatch

var fs = newFutureStream[int]()

proc alpha() {.async.} =
  for i in 0 .. 5:
    await fs.write(i)
    await sleepAsync(200)

  echo("Done")
  fs.complete()

proc beta() {.async.} =
  while not fs.finished:
    let (hasValue, value) = await fs.read()
    if hasValue:
      echo(value)

  echo("Finished")

asyncCheck alpha()
waitFor beta()

template ensureCallbacksAreScheduled =
  # callbacks are called directly if the dispatcher is not running
  discard getGlobalDispatcher()

proc testCompletion() {.async.} =
  ensureCallbacksAreScheduled

  var stream = newFutureStream[string]()

  for i in 1..5:
    await stream.write($i)

  var readFuture = stream.readAll()
  stream.complete()
  yield readFuture
  let data = readFuture.read()
  doAssert(data.len == 5, "actual data len = " & $data.len)

waitFor testCompletion()

# TODO: Something like this should work eventually.
# proc delta(): FutureStream[string] {.async.} =
#   for i in 0 .. 5:
#     await sleepAsync(1000)
#     result.put($i)

#   return ""

# proc omega() {.async.} =
#   let fut = delta()
#   while not fut.finished():
#     echo(await fs.takeAsync())

#   echo("Finished")

# waitFor omega()