diff --git a/lib/iterable_extension.dart b/lib/iterable_extension.dart
index f0cc900f..f2b21303 100644
--- a/lib/iterable_extension.dart
+++ b/lib/iterable_extension.dart
@@ -1,3 +1,5 @@
+import 'package:tuple/tuple.dart';
+
 extension IterableExtension<T> on Iterable<T> {
   /// Return a new sorted list
   List<T> sorted([int compare(T a, T b)]) => this.toList()..sort(compare);
@@ -13,6 +15,8 @@ extension IterableExtension<T> on Iterable<T> {
     }
   }
 
+  Iterable<Tuple2<int, T>> withIndex() => mapWithIndex((i, e) => Tuple2(i, e));
+
   /// Whether the collection contains an element equal to [element] using the
   /// equality function [equalFn]
   bool containsIf(T element, bool Function(T a, T b) equalFn) =>
diff --git a/test/iterable_extension_test.dart b/test/iterable_extension_test.dart
index 8e10ca20..6916581f 100644
--- a/test/iterable_extension_test.dart
+++ b/test/iterable_extension_test.dart
@@ -20,6 +20,16 @@ void main() {
       expect(result[4], Tuple2(4, 3));
     });
 
+    test("withIndex", () {
+      final src = [1, 4, 5, 2, 3];
+      final result = src.withIndex().toList();
+      expect(result[0], Tuple2(0, 1));
+      expect(result[1], Tuple2(1, 4));
+      expect(result[2], Tuple2(2, 5));
+      expect(result[3], Tuple2(3, 2));
+      expect(result[4], Tuple2(4, 3));
+    });
+
     test("containsIf", () {
       final src = [
         _ContainsIfTest(1),