// 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<T> distinct([bool equals(T previous, T next)])
///    If a broadcast stream is listened to more than once, each subscription
/// will individually perform the equals test.
/// @description Checks that [equals] is called for each subscription.
/// @issue #29638
/// @author a.semenov@unipro.ru

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

class Key<T> {
  T previous;
  T next;

  Key(this.previous, this.next);

  bool operator ==(other) => (other is Key)
      && other.previous == this.previous
      && other.next == this.next;

  int get hashCode {
    return previous.hashCode ^ next.hashCode;
  }

  String toString() {
    return "[$previous,$next]";
  }
}

Future<List<T>> subscribe<T>(Stream<T> stream) {
  Completer<List<T>> completer = new Completer<List<T>>();
  List<T> received = [];
  stream.listen(
      (T event) {
        received.add(event);
      },
      onDone: () {
        completer.complete(received);
      }
  );
  return completer.future;
}

void check<T>(Stream<T> s) {
  Map<Key<T>, int> equalsLog = new Map<Key<T>, int>();

  bool equals(T p, T n) {
  //  print("equals($p,$n)");
    Key<T> key = new Key<T>(p,n);
    equalsLog[key] = 1 + equalsLog.putIfAbsent(key, () => 0);
    return p==n;
  }

  asyncStart();
  Stream<T> d = s.asBroadcastStream().distinct(equals);
  Future.wait([
    subscribe(d),
    subscribe(d),
    subscribe(d)
  ]).then(
    (List<List<T>> result) {
  //    print(equalsLog);
  //    result.forEach(print);
      result.forEach((received) => Expect.listEquals(result[0], received));
      equalsLog.values.forEach((v) => Expect.equals(3, v));
      asyncEnd();
    }
  );

}

void test(CreateStreamFunction create) {
  check(create([]));
  check(create([1, 2, 4, 3]));
  check(create([1, 2, 2, 3]));
  check(create(["a", "b", null, null]));
//  check(create(new Iterable.generate(5, (int index) => 1)));
//  check(create(new Iterable.generate(10, (int index) => [0])));
}
