// Copyright (c) 2017, 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 dynamic fold(initialValue, combine(previousValue, E element))
/// Reduces a collection to a single value by iteratively combining each
/// [element] of the collection with an existing value.
/// Uses [initialValue] as the initial value, then iterates through the elements
/// and updates the [value] with each element using the [combine] function.
/// @description Checks that the result of folding is correct.
/// @author iarkh@unipro.ru

import "dart:collection";
import "dart:math";
import "../../../Utils/expect.dart";

class MyIterable extends Object with IterableMixin {
  List _content;
  MyIterable(List list): _content = list;

  Iterator get iterator {
    return _content.iterator;
  }
}

check(List list, num init, num combine(value, element), num expected) {
  IterableMixin iterable = new MyIterable(list);
  num actual = iterable.fold(init, combine);
  Expect.equals(expected, actual);
}	

main() {
  check([1, 2, -3], 0, (value, element) => value + element, 0);
  check([1, 2, -3], 1, (value, element) => value * element, -6);
  check([0, 2, -3], 1, (value, element) => value * element, 0);
  check(const[1, 2, -5, -6], -1000,
      (value, element) => max(value, element), 2);
}
