private static <E> CycList<CycList<E>> combinationsOfInternal(final CycList<E> selectedItems, final CycList<E> availableItems) {
    final CycList<CycList<E>> result = CycList.list(selectedItems);
    if (availableItems.size() == 0) {
      return result;
    }
    CycList<E> combination = null;
    for (int i = 0; i < (selectedItems.size() - 1); i++) {
      for (int j = 0; j < availableItems.size(); j++) {
        final E availableItem = availableItems.get(j);
        // Remove it (making copy), shift left, append replacement.
        combination = (CycList) selectedItems.clone();
        combination.remove(i + 1);
        combination.add(availableItem);
        result.add(combination);
      }
    }
    final CycList newSelectedItems = (CycList) selectedItems.rest();
    newSelectedItems.add(availableItems.first());
    final CycList newAvailableItems = (CycList) availableItems.rest();
    result.addAll(combinationsOfInternal(newSelectedItems, newAvailableItems));
    return result;
  }