// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// @assertion Stream<T> asBroadcastStream ({void onListen(StreamSubscription<T>
///   subscription), void onCancel(StreamSubscription<T> subscription)})
/// Returns a multi-subscription stream that produces the same events as this.
/// If this stream is single-subscription, return a new stream that allows multiple subscribers.
/// It will subscribe to this stream when its first subscriber is added,
/// and will stay subscribed until this stream ends, or a callback cancels the subscription.
/// @description Checks that if some subscriptions to broadcast stream cancel,
/// other still listen to completion.
/// @author ilya

import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateStream.dart" as IsolateStream;

const subscribersCount = 10;
const dataSize = 12;

multiListen(Stream s) {
  for (int i = 0; i < subscribersCount; ++i) {
    asyncStart();
    if (i.isEven) {
      // listener that quits after half of data
      var listening = true;
      var quitter = s.listen(null);
      quitter.onData((data) {
        if (listening) {
          if (data > dataSize / 2) {
            quitter.cancel();
            listening = false;
            asyncEnd();
          }
        } else {
          Expect.fail('onData event after cancel');
        }
      });
    } else {
      // listener that works to completion
      int processed = 0;
      s.listen((data) {
        ++processed;
      }, onDone: () {
        Expect.equals(dataSize, processed);
        asyncEnd();
      });
    }
  }
}

main() {
  multiListen(
      IsolateStream.fromIterable(new Iterable.generate(dataSize, (i) => i))
          .asBroadcastStream());
}
