-/*
- * Simple template for obtaining the unqualified type given a generic
- * type T. For example, if T is const int,
- * typeof(remove_cv_from_expression(T())) yields int. Due to a bug in
- * g++, you need to actually use
- * typeof(remove_cv_from_expression(T())) instead of typename
- * boost::remove_cv<T>::type. Note that the function
- * remove_cv_from_expression is never defined - use it only inside
- * typeof.
+/**
+ * Utility method to help access elements of a sequence with one uniform
+ * interface
+ *
+ * This can be useful for example when you are looping through a sequence and
+ * want to modify another sequence based on the information in the current
+ * sequence
+ *
+ * auto range_one = std::make_tuple(1, 2, 3);
+ * auto range_two = std::make_tuple(4, 5, 6);
+ * folly::for_each(range_one, [&range_two](auto ele, auto index) {
+ * folly::fetch(range_two, index) = ele;
+ * });
+ *
+ * For non-tuple like ranges, this works by first trying to use the iterator
+ * class if the iterator has been marked to be a random access iterator. This
+ * should be inspectable via the std::iterator_traits traits class. If the
+ * iterator class is not present or is not a random access iterator then the
+ * implementation falls back to trying to use the indexing operator
+ * (operator[]) to fetch the required element