docs: @CanIgnoreReturnValue
    public final Ordered containsAtLeastElementsIn(Iterable<?> expectedIterable) {
      List<?> actual = Lists.newLinkedList(actual());
      final Collection<?> expected = iterableToCollection(expectedIterable);
  
      List<Object> missing = newArrayList();
      List<Object> actualNotInOrder = newArrayList();
  
      boolean ordered = true;
      // step through the expected elements...
      for (Object e : expected) {
        int index = actual.indexOf(e);
        if (index != -1) { // if we find the element in the actual list...
          // drain all the elements that come before that element into actualNotInOrder
          moveElements(actual, actualNotInOrder, index);
          // and remove the element from the actual list
          actual.remove(0);
        } else { // otherwise try removing it from actualNotInOrder...
          if (actualNotInOrder.remove(e)) { // if it was in actualNotInOrder, we're not in order
            ordered = false;
          } else { // if it's not in actualNotInOrder, we're missing an expected element
            missing.add(e);
          }
        }
      }
      // if we have any missing expected elements, fail
      if (!missing.isEmpty()) {
        return failAtLeast(expected, missing);
      }
  
      /*
       * TODO(cpovirk): In the NotInOrder case, also include a Fact that shows _only_ the required
       * elements (that is, without any extras) but in the order they were actually found. That should
       * make it easier for users to compare the actual order of the required elements to the expected
       * order. Or, if that's too much trouble, at least try to find a better title for the full
       * actual iterable than the default of "but was," which may _sound_ like it should show only the
       * required elements, rather than the full actual iterable.
       */
      return ordered
          ? IN_ORDER
          : new Ordered() {
            @Override
            public void inOrder() {
              failWithActual(
                  simpleFact("required elements were all found, but order was wrong"),
                  fact("expected order for required elements", expected));
            }
          };
    }