シーケンスで列挙しつつ最後の要素かどうか判定する 2

昨日の件、Seq.pairwiseのコードをちょっと変更した関数を作ってもいいかもしれない。

pairwiseを変形したコード

たとえばpeekという関数にする。シグネチャは val peek : seq<'T> -> seq<'T * bool>。

module Seq =
let peek (source:seq<'T>) = seq {
use ie = source.GetEnumerator()
if ie.MoveNext() then
let
iref = ref ie.Current
while ie.MoveNext() do
let
j = ie.Current
yield (!iref, true)
iref := j
yield (!iref, false) }

テスト

[<Test>]
let ``detect last element of seq with custom function`` () =
let seq = seq { 1 .. 5 }
Seq.peek seq
|> Seq.iter (function
| e, true -> printfn "%d" e
| e, false -> printfn "last %d" e)

出力結果

こう出力される。

1
2
3
4
last 5