三角形状に1次元の配列をループし、全ての組み合わせに対して処理を行いたい場合、Javaでは以下のような物になると思います

Foo[] data = ...;
for(int i = 0; i < data.length(); i++) {
    for(int j = i + 1; j < data.length(); j++) {
        //いろいろdata[i]やdata[j]を使って計算
        data[i].bar += ...;
        data[j].bar += ...;
    }
}

これをRustでIteratorのみでやる方法はあるのでしょうか?
以下のように内部ループで元のiterを変えないようにコピーを作れれば(元のデータはコピーせず参照)と考えていたのですが、それらしき関数が見当たらなかったので

let mut data: Vec<Foo> = ...;
let mut iter = data.iter_mut();
while let Some(idata) = iter.next() {
     //内部ループでは外部ループで使う`iter`を消費しないようにしたい
    let mut inner_iter = iter.clone();
    for jdata in inner_iter {
        //いろいろidataやjdataを使って計算
        idata.bar += ...;
        jdata.bar += ...;
    }
}