Iterator::fuseFusedIterator について。

背景情報

ヒューズ

Iterator::next メソッドの挙動には二種類のパターンがある。

ヒューズ形式

None を一度でも戻すと、その後はずっと None のみを戻す。

これは例えば、コレクションの読取などで使われる。ここで None は全ての要素の読取完了を表すため、それが検出された時点でイテレータはお役御免となる。

非ヒューズ形式

None を戻した後でも、再び Some を戻す場合がある。

これは例えば、通信データの読取などで使われる。ここで None は通信終了を表すが、その後に Some で通信再開される場合もあるため、イテレータはまだ活躍できる。

関連アイテム

以下のアイテムにより、自作のイテレータをヒューズ形式だと宣言したり、非ヒューズ形式のイテレータをヒューズ形式に変換したりできる (これは例えば、通信データの読込イテレータを 1 ストリームの読込のみに制限できる)。

Iterator::fuse

selfFuse でラップするメソッド。

Fuse<I>

イテレータを FusedIterator にするラッパー。

FusedIterator

イテレータをヒューズ形式であると宣言するマーカートレイト。

実装のポイント

Fuse のラップ先が元から FusedIterator を実装している場合、Fuse は何もせずただラップ先に処理を転送する実装となる。この配慮により、イテレータの処理は若干だが速くなり、ループの処理速度が地味に改善される事もあるだろう。ただ、この影響で FusedIterator と宣言したにも関わらず、実はその要件を守れていないとバグになる。