OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.async; | 5 part of dart.async; |
6 | 6 |
7 // ------------------------------------------------------------------- | 7 // ------------------------------------------------------------------- |
8 // Core Stream types | 8 // Core Stream types |
9 // ------------------------------------------------------------------- | 9 // ------------------------------------------------------------------- |
10 | 10 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 * their input to pause too. | 68 * their input to pause too. |
69 * | 69 * |
70 * The default implementation of [isBroadcast] returns false. | 70 * The default implementation of [isBroadcast] returns false. |
71 * A broadcast stream inheriting from [Stream] must override [isBroadcast] | 71 * A broadcast stream inheriting from [Stream] must override [isBroadcast] |
72 * to return `true`. | 72 * to return `true`. |
73 */ | 73 */ |
74 abstract class Stream<T> { | 74 abstract class Stream<T> { |
75 Stream(); | 75 Stream(); |
76 | 76 |
77 /** | 77 /** |
| 78 * Internal use only. We do not want to promise that Stream stays const. |
| 79 * |
| 80 * If mixins become compatible with const constructors, we may use a |
| 81 * stream mixin instead of extending Stream from a const class. |
| 82 */ |
| 83 const Stream._internal(); |
| 84 |
| 85 /** |
| 86 * Creates an empty broadcast stream. |
| 87 * |
| 88 * This is a stream which does nothing except sending a done event |
| 89 * when it's listened to. |
| 90 */ |
| 91 const factory Stream.empty() = _EmptyStream<T>; |
| 92 |
| 93 /** |
78 * Creates a new single-subscription stream from the future. | 94 * Creates a new single-subscription stream from the future. |
79 * | 95 * |
80 * When the future completes, the stream will fire one event, either | 96 * When the future completes, the stream will fire one event, either |
81 * data or error, and then close with a done-event. | 97 * data or error, and then close with a done-event. |
82 */ | 98 */ |
83 factory Stream.fromFuture(Future<T> future) { | 99 factory Stream.fromFuture(Future<T> future) { |
84 // Use the controller's buffering to fill in the value even before | 100 // Use the controller's buffering to fill in the value even before |
85 // the stream has a listener. For a single value, it's not worth it | 101 // the stream has a listener. For a single value, it's not worth it |
86 // to wait for a listener before doing the `then` on the future. | 102 // to wait for a listener before doing the `then` on the future. |
87 _StreamController<T> controller = new StreamController<T>(sync: true); | 103 _StreamController<T> controller = new StreamController<T>(sync: true); |
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 { Function onError, | 1432 { Function onError, |
1417 void onDone(), | 1433 void onDone(), |
1418 bool cancelOnError }) { | 1434 bool cancelOnError }) { |
1419 return _stream.listen(onData, onError: onError, onDone: onDone, | 1435 return _stream.listen(onData, onError: onError, onDone: onDone, |
1420 cancelOnError: cancelOnError); | 1436 cancelOnError: cancelOnError); |
1421 } | 1437 } |
1422 } | 1438 } |
1423 | 1439 |
1424 | 1440 |
1425 /** | 1441 /** |
1426 * The target of a [Stream.pipe] call. | 1442 * Abstract interface for a "sink" accepting multiple entire streams. |
1427 * | 1443 * |
1428 * The [Stream.pipe] call will pass itself to this object, and then return | 1444 * A consumer can accept a number of consequtive streams using [addStream], |
1429 * the resulting [Future]. The pipe should complete the future when it's | 1445 * and when no further data need to be added, the [close] method tells the |
1430 * done. | 1446 * consumer to complete its work and shut down. |
| 1447 * |
| 1448 * This class is not just a [Sink<Stream>] because it is also combined with |
| 1449 * other [Sink] classes, like it's combined with [EventSink] in the |
| 1450 * [StreamSink] class. |
| 1451 * |
| 1452 * The [Stream.pipe] accepts a `StreamConsumer` and will pass the stream |
| 1453 * to the consumer's [addStream] method. When that completes, it will |
| 1454 * call [close] and then complete its own returned future. |
1431 */ | 1455 */ |
1432 abstract class StreamConsumer<S> { | 1456 abstract class StreamConsumer<S> { |
1433 /** | 1457 /** |
1434 * Consumes the elements of [stream]. | 1458 * Consumes the elements of [stream]. |
1435 * | 1459 * |
1436 * Listens on [stream] and does something for each event. | 1460 * Listens on [stream] and does something for each event. |
1437 * | 1461 * |
1438 * The consumer may stop listening after an error, or it may consume | 1462 * Returns a future which is completed when the stream is done being added, |
1439 * all the errors and only stop at a done event. | 1463 * and the consumer is ready to accept a new stream. |
| 1464 * No further calls to [addStream] or [close] should happen before the |
| 1465 * returned future has completed. |
| 1466 * |
| 1467 * The consumer may stop listening to the stream after an error, |
| 1468 * it may consume all the errors and only stop at a done event, |
| 1469 * or it may be canceled early if the receiver don't want any further events. |
| 1470 * |
| 1471 * If the consumer stops listening because of some error preventing it |
| 1472 * from continuing, it may report this error in the returned future, |
| 1473 * otherwise it will just complete the future with `null`. |
1440 */ | 1474 */ |
1441 Future addStream(Stream<S> stream); | 1475 Future addStream(Stream<S> stream); |
1442 | 1476 |
1443 /** | 1477 /** |
1444 * Tell the consumer that no futher streams will be added. | 1478 * Tells the consumer that no futher streams will be added. |
1445 * | 1479 * |
1446 * Returns a future that is completed when the consumer is done handling | 1480 * This allows the consumer to complete any remaining work and release |
1447 * events. | 1481 * resources that are no longer needed |
| 1482 * |
| 1483 * Returns a future which is completed when the consumer has shut down. |
| 1484 * If cleaning up can fail, the error may be reported in the returned future, |
| 1485 * otherwise it completes with `null`. |
1448 */ | 1486 */ |
1449 Future close(); | 1487 Future close(); |
1450 } | 1488 } |
1451 | 1489 |
1452 | 1490 |
1453 /** | 1491 /** |
| 1492 * A object that accepts stream events both synchronously and asynchronously. |
| 1493 * |
1454 * A [StreamSink] unifies the asynchronous methods from [StreamConsumer] and | 1494 * A [StreamSink] unifies the asynchronous methods from [StreamConsumer] and |
1455 * the synchronous methods from [EventSink]. | 1495 * the synchronous methods from [EventSink]. |
1456 * | 1496 * |
1457 * The [EventSink] methods can't be used while the [addStream] is called. | 1497 * The [EventSink] methods can't be used while the [addStream] is called. |
1458 * As soon as the [addStream]'s [Future] completes with a value, the | 1498 * As soon as the [addStream]'s [Future] completes with a value, the |
1459 * [EventSink] methods can be used again. | 1499 * [EventSink] methods can be used again. |
1460 * | 1500 * |
1461 * If [addStream] is called after any of the [EventSink] methods, it'll | 1501 * If [addStream] is called after any of the [EventSink] methods, it'll |
1462 * be delayed until the underlying system has consumed the data added by the | 1502 * be delayed until the underlying system has consumed the data added by the |
1463 * [EventSink] methods. | 1503 * [EventSink] methods. |
1464 * | 1504 * |
1465 * When [EventSink] methods are used, the [done] [Future] can be used to | 1505 * When [EventSink] methods are used, the [done] [Future] can be used to |
1466 * catch any errors. | 1506 * catch any errors. |
1467 * | 1507 * |
1468 * When [close] is called, it will return the [done] [Future]. | 1508 * When [close] is called, it will return the [done] [Future]. |
1469 */ | 1509 */ |
1470 abstract class StreamSink<S> implements StreamConsumer<S>, EventSink<S> { | 1510 abstract class StreamSink<S> implements EventSink<S>, StreamConsumer<S> { |
1471 /** | 1511 /** |
1472 * As [EventSink.close], but returns a future. | 1512 * Tells the stream sink that no futher streams will be added. |
| 1513 * |
| 1514 * This allows the stream sink to complete any remaining work and release |
| 1515 * resources that are no longer needed |
| 1516 * |
| 1517 * Returns a future which is completed when the stream sink has shut down. |
| 1518 * If cleaning up can fail, the error may be reported in the returned future, |
| 1519 * otherwise it completes with `null`. |
1473 * | 1520 * |
1474 * Returns the same future as [done]. | 1521 * Returns the same future as [done]. |
| 1522 * |
| 1523 * The stream sink may close before the [close] method is called, either due |
| 1524 * to an error or because it is itself provding events to someone who has |
| 1525 * stopped listening. In that case, the [done] future is completed first, |
| 1526 * and the `close` method will return the `done` future when called. |
| 1527 * |
| 1528 * Unifies [StreamConsumer.close] and [EventSink.close] which both mark their |
| 1529 * object as not expecting any further events. |
1475 */ | 1530 */ |
1476 Future close(); | 1531 Future close(); |
1477 | 1532 |
1478 /** | 1533 /** |
1479 * Return a future which is completed when the [StreamSink] is finished. | 1534 * Return a future which is completed when the [StreamSink] is finished. |
1480 * | 1535 * |
1481 * If the `StreamSink` fails with an error, | 1536 * If the `StreamSink` fails with an error, |
1482 * perhaps in response to adding events using [add], [addError] or [close], | 1537 * perhaps in response to adding events using [add], [addError] or [close], |
1483 * the [done] future will complete with that error. | 1538 * the [done] future will complete with that error. |
1484 * | 1539 * |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1658 class _ControllerEventSinkWrapper<T> implements EventSink<T> { | 1713 class _ControllerEventSinkWrapper<T> implements EventSink<T> { |
1659 EventSink _sink; | 1714 EventSink _sink; |
1660 _ControllerEventSinkWrapper(this._sink); | 1715 _ControllerEventSinkWrapper(this._sink); |
1661 | 1716 |
1662 void add(T data) { _sink.add(data); } | 1717 void add(T data) { _sink.add(data); } |
1663 void addError(error, [StackTrace stackTrace]) { | 1718 void addError(error, [StackTrace stackTrace]) { |
1664 _sink.addError(error, stackTrace); | 1719 _sink.addError(error, stackTrace); |
1665 } | 1720 } |
1666 void close() { _sink.close(); } | 1721 void close() { _sink.close(); } |
1667 } | 1722 } |
OLD | NEW |