Add reduce/fold indexed versions.
diff --git a/lib/src/iterable_extensions.dart b/lib/src/iterable_extensions.dart
index 666527f..253d13c 100644
--- a/lib/src/iterable_extensions.dart
+++ b/lib/src/iterable_extensions.dart
@@ -107,6 +107,46 @@
     }
   }
 
+  /// Combine the elements with each other and the current index.
+  ///
+  /// Calls [combine] for each element except the first.
+  /// The call passes the index of the current element, the result of the
+  /// previous call, or the first element for the first call, and
+  /// the current element.
+  ///
+  /// Returns the result of the last call, or the first element if
+  /// there is only one element.
+  /// There must be at least one element.
+  T reduceIndexed(T Function(int index, T previous, T element) combine) {
+    var iterator = this.iterator;
+    if (!iterator.moveNext()) {
+      throw StateError('no elements');
+    }
+    var index = 1;
+    var result = iterator.current;
+    while (iterator.moveNext()) {
+      result = combine(index++, result, iterator.current);
+    }
+    return result;
+  }
+
+  /// Combine the elements with a value and the current index.
+  ///
+  /// Calls [combine] for each element with the current index,
+  /// the result of the previous call, or [initialValue] for the first element,
+  /// and the current element.
+  ///
+  /// Returns the result of the last call to [combine],
+  /// or [initialValue] if there are no elements.
+  R foldIndexed<R>(R initialValue, R Function(int index , R previous, T element) combine) {
+    var result = initialValue;
+    var index = 0;
+    for (var element in this) {
+      result = combine(index++, result, element);
+    }
+    return result;
+  }
+
   /// The first element satisfying [test], or `null` if there are none.
   T /*?*/ firstWhereOrNull(bool Function(T element) test) {
     for (var element in this) {