Files
Nim/tests/async/tfuturestream.nim
Miran 8088633250 faster CIs (#13803)
* ttables: smaller table, 5x speedup

* thavlak: less iterations, less loops; 30% speedup

* tasyncclosestall: shorter timeout; 35% speedup

* gcleak4: less iterations, 2x speedup

* ttimes: remove deprecated stuff

* tdangerisrelease: remove cpp backend, 3x speedup

* tfrexp1: smaller range, 2x speedup

* trtree: fix warnings, less iterations, 6x speedup

* tasyncawait_cyclebreaker: smaller swarm size; 2x speedup

* trealloc: smaller number of iterations; 10x speedup

* towned_binary_tree: less iterations, 4x speedup

* tclosure: remove unused code, less iterations; 2x speedup

* twaitany: less durations; 1.4x speedup

* tasync_misc: less iterations, 2x speedup

* t8535: smaller sleep, 1.5x speedup

* tmanyjoin: smaller sleep, 2x speedup

* t12221: shorter sleeps, removed two slower tests; 1.6x speedup

* tfuturestream: smaller sleep; 1.5x speedup

* growobjcrash: less iterations; 2x speedup

* ttryrecv: smaller sleep; 1.5x speedup

* treusetvar: less threads; 2x speedup

* delete tthreadanalysis2, basically a duplicate of tthreadanalysis

* t7758: less iterations, 1.5x speedup

* tasyncawait: smaller swarm, less messages; 1.5x speedup

* tjsandnativeasync: smaller sleep, 1.5x speedup

* tpendingcheck: smaller sleep, 1.5x speedup

* remove rodfiles test category

* move tseq from its own category to 'collections' category

* remove unneeded tests and helpers from 'assert' category

* stdlib: merge tbitops2 into tbitops

* remove 'trepr2' from 'stdlib' cat

* merge 'tstreams' into one file

* remove 'tinefficient_const_table' from 'ccbugs' cat

* merge 'tcollections_to_string' into 'tcollections'

* tblocking_channel: smaller sleep, small speedup

* tconvexhull: less iterartions; 1.2x speedup

* merge 'tdeepcopy2' into 'tdeepcopy'

* merge 'tdisjoint_slice2' into 'tdisjoint_slice1'

* tmissing_deepcopy: smaller sequence

* tsendtwice: smaller arrays; 5x speedup

* remove 'tindexerrorformatbounds'

* disable multimethod tests

* remove 'gc:none' and 'refc' without 'd:useRealtimeGC' from gc tests

* koch.nim: bootstrap just with '-d:release', no need for 'csource'

* add github workflow for documentation

* testament: no need for 8 sub-second decimals
2020-03-30 13:18:12 +02:00

72 lines
1.2 KiB
Nim

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(100)
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()