// 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 factory StreamTransformer(StreamSubscription<T>
///   transformer(Stream<S> stream, bool cancelOnError))
/// Creates a StreamTransformer.
///
/// The result of invoking the transformer closure is a StreamSubscription.
/// The bound stream-transformer (created by the bind method above) then
/// sets the handlers it received as part of the listen call.
///
/// @description Checks expected data events on transformed stream.
/// @author ilya

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

// transform: skip evens, produce number and its double, convert errors to data
myTransformer() {
  return new StreamTransformer(
    (Stream s, _) {
      StreamController c = new StreamController();
      s.listen(
        (x) {
          if (x.isOdd) {
            c.add(x);
            c.add(x*2);
          }
        },
        onError:(x) {
          c.add(x);
        },
        onDone:() {
          c.close();
        }
      );
      return c.stream.listen(null);
    }
  );
}

main() {
  StreamController c = new StreamController();
  c.add(1);
  c.add(2);
  c.add(3);
  c.add(4);
  c.add(5);
  c.addError(1);
  c.addError(2);
  c.addError(3);
  c.addError(4);
  c.addError(5);

  asyncStart();
  
  c.stream.transform(myTransformer()).toList().then(
    (x) {
      Expect.listEquals([1,2,3,6,5,10,1,2,3,4,5], x);
      asyncEnd();
    }
  );

  c.close();
}
