// 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.

// @dart = 2.9

/// @assertion Stream.eventTransformed(Stream source,
///   EventSink mapSink(EventSink<T> sink))
/// Creates a stream where all events of an existing stream are piped through
/// a sink-transformation.
/// The given mapSink closure is invoked when the returned stream is listened
/// to. All events from the source are added into the event sink that is
/// returned from the invocation. The transformation puts all transformed
/// events into the sink the mapSink closure received during its invocation.
/// Conceptually the mapSink creates a transformation pipe with the input sink
/// being the returned EventSink and the output sink being the sink it received.
/// @description Checks that error events are the same if mapSink closure
/// returns a sink that correctly implements EventSink.
/// @author ilya

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

// transform: skip evens, produce number and its double
class MySink implements EventSink<int> {
  final _sink;
  MySink(this._sink);
  void add(int i) {
    if (i.isOdd) {
      _sink.add(i);
      _sink.add(i * 2);
    }
  }
  void addError(e, [st]) => _sink.addError(e, st);
  void close() => _sink.close();
}

List<int> input = [1, 2, 3, 4, 5];

main() {
  Stream s = new Stream.fromIterable(input).map((x) {throw x;});
  Stream s2 = new Stream.eventTransformed(s, (sink) => new MySink(sink));

  AsyncExpect.events([], input, s2);
}
