// Copyright (c) 2018, 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
/// Future<RawSocketEvent> reduce(
///     RawSocketEvent combine(T previous, T element)
/// )
/// . . .
/// Similar to Iterable.reduce, this function maintains a value, starting with
/// the first element of the stream and updated for each further element of this
/// stream. For each element after the first, the value is updated to the result
/// of calling combine with the previous value and the element.
///
/// @description Checks that if this stream contains only one event, combine
/// method is not called and the returned future is completed with this single
/// event.
/// @author ngl@unipro.ru

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

main() {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      int sent = 0;
      int nCalls = 0;
      List list = [];
      RawSocketEvent combine(RawSocketEvent previous, RawSocketEvent element) {
        nCalls++;
        list.add(previous);
        list.add(element);
        return element;
      }
      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.close();
      receiver.close();

      Future future = receiver.reduce(combine);
      future.then((event) {
        Expect.equals(RawSocketEvent.closed, event);
        Expect.equals(0, nCalls);
        Expect.isTrue(list.isEmpty);
      }).whenComplete(() {
        asyncEnd();
      });
    });
  });
}
