PowerShellでtakeWhile

PowerShellのbreakは、
パイプ処理を、先行する関数を含めて途中で止める
効果があると知った。
参考:
http://d.hatena.ne.jp/NyaRuRu/20080112/p1
http://mojibake.seesaa.net/article/78084208.html
そこで、HaskellのtakeWhileらしきものを実装してみた。
といっても2行。スクリプトブロックがfalseを返したらbreakするだけ。

止められると分かれば、安心して無限ストリームを生成する関数が書ける。
enumFrom nはパイプにn, n + 1, n + 2...を流す関数。明らかに無限ループ。

ただし、バージョンの違いはよく理解していない。とりあえず以下のスクリプト
1.0, 2.0で同様の出力をした。

function Main
{
  enumFrom 10 | takeWhile {$_ * $_ -lt 200}
  1 .. 100 | takeWhile { Write-Host "hoge"; $false }
  1 .. 100 | % { Write-Host "hoge"; break }
}

filter takeWhile([ScriptBlock] $script)
{
  if(!(& $script)) { break }
  $_
}

function enumFrom([int] $n)
{
  $count = $n
  while($true)
  {
    $count
    $count++
  }
}

. Main

実行結果

10
11
12
13
14

Write-Hostもキャンセルされる。