Iterator::fuse と FusedIterator について。
Iterator::next メソッドの挙動には二種類のパターンがある。
None を一度でも戻すと、その後はずっと None のみを戻す。
これは例えば、コレクションの読取などで使われる。ここで None は全ての要素の読取完了を表すため、それが検出された時点でイテレータはお役御免となる。
None を戻した後でも、再び Some を戻す場合がある。
これは例えば、通信データの読取などで使われる。ここで None は通信終了を表すが、その後に Some で通信再開される場合もあるため、イテレータはまだ活躍できる。
以下のアイテムにより、自作のイテレータをヒューズ形式だと宣言したり、非ヒューズ形式のイテレータをヒューズ形式に変換したりできる (これは例えば、通信データの読込イテレータを 1 ストリームの読込のみに制限できる)。
Iterator::fuse
self を Fuse でラップするメソッド。
Fuse<I>
イテレータを FusedIterator にするラッパー。
FusedIterator
イテレータをヒューズ形式であると宣言するマーカートレイト。
Fuse のラップ先が元から FusedIterator を実装している場合、Fuse は何もせずただラップ先に処理を転送する実装となる。この配慮により、イテレータの処理は若干だが速くなり、ループの処理速度が地味に改善される事もあるだろう。ただ、この影響で FusedIterator と宣言したにも関わらず、実はその要件を守れていないとバグになる。
、std::vec::Splice は FusedIterator を実装していない。