···
232
+
describe('toAsyncIterable', () => {
233
+
it('creates an async iterable mirroring the Wonka source', async () => {
235
+
let sink: Sink<any> | null = null;
237
+
const source: Source<any> = _sink => {
241
+
if (signal === TalkbackKind.Pull) pulls++;
246
+
const asyncIterator = sinks.toAsyncIterable(source)[Symbol.asyncIterator]();
248
+
expect(pulls).toBe(1);
250
+
expect(await asyncIterator.next()).toEqual({ value: 0, done: false });
251
+
expect(pulls).toBe(2);
254
+
expect(await asyncIterator.next()).toEqual({ value: 1, done: false });
255
+
expect(pulls).toBe(3);
257
+
sink!(SignalKind.End);
258
+
expect(await asyncIterator.next()).toEqual({ done: true });
259
+
expect(pulls).toBe(3);
262
+
it('buffers actively pushed values', async () => {
264
+
let sink: Sink<any> | null = null;
266
+
const source: Source<any> = _sink => {
270
+
if (signal === TalkbackKind.Pull) pulls++;
275
+
const asyncIterator = sinks.toAsyncIterable(source)[Symbol.asyncIterator]();
279
+
sink!(SignalKind.End);
281
+
expect(pulls).toBe(1);
282
+
expect(await asyncIterator.next()).toEqual({ value: 0, done: false });
283
+
expect(await asyncIterator.next()).toEqual({ value: 1, done: false });
284
+
expect(await asyncIterator.next()).toEqual({ done: true });
287
+
it('asynchronously waits for pulled values', async () => {
289
+
let sink: Sink<any> | null = null;
291
+
const source: Source<any> = _sink => {
295
+
if (signal === TalkbackKind.Pull) pulls++;
300
+
const asyncIterator = sinks.toAsyncIterable(source)[Symbol.asyncIterator]();
301
+
expect(pulls).toBe(1);
303
+
let resolved = false;
305
+
const promise = asyncIterator.next().then(value => {
310
+
await Promise.resolve();
311
+
expect(resolved).toBe(false);
314
+
sink!(SignalKind.End);
315
+
expect(await promise).toEqual({ value: 0, done: false });
316
+
expect(await asyncIterator.next()).toEqual({ done: true });
319
+
it('supports cancellation via return', async () => {
321
+
let sink: Sink<any> | null = null;
323
+
const source: Source<any> = _sink => {
327
+
if (signal === TalkbackKind.Close) ended = true;
332
+
const asyncIterator = sinks.toAsyncIterable(source)[Symbol.asyncIterator]();
335
+
expect(await asyncIterator.next()).toEqual({ value: 0, done: false });
336
+
expect(await asyncIterator.return!()).toEqual({ done: true });
339
+
expect(await asyncIterator.next()).toEqual({ done: true });
341
+
expect(ended).toBeTruthy();
344
+
it('supports for-await-of', async () => {
347
+
const source: Source<any> = sink => {
350
+
if (signal === TalkbackKind.Pull) {
351
+
sink(pulls < 3 ? push(pulls++) : SignalKind.End);
357
+
const iterable = sinks.toAsyncIterable(source);
358
+
const values: any[] = [];
359
+
for await (const value of iterable) {
360
+
values.push(value);
363
+
expect(values).toEqual([0, 1, 2]);
366
+
it('supports for-await-of with early break', async () => {
368
+
let closed = false;
370
+
const source: Source<any> = sink => {
373
+
if (signal === TalkbackKind.Pull) {
374
+
sink(pulls < 3 ? push(pulls++) : SignalKind.End);
382
+
const iterable = sinks.toAsyncIterable(source);
383
+
for await (const value of iterable) {
384
+
expect(value).toBe(0);
388
+
expect(closed).toBe(true);
describe('toObservable', () => {
it('creates an Observable mirroring the Wonka source', () => {