/* Page prose (ja) */
"ProducingWithAsyncStream" = "# AsyncStream でシーケンスを生成する\n\n消費は物語の半分です。多くの場合、値が少しずつ入ってくるのは*あなた*の側で（タイマーから、位置情報のコールバックから、Bluetooth センサーから）、それらを `for await` ループに渡したくなります。**`AsyncStream` は、1 つずつ届く値のソースを非同期シーケンスに変えるツールです。**\n\n**continuation** を受け取るクロージャで作成します。continuation は、stream に値を押し込むために呼び出すオブジェクトです。\n\n* `continuation.yield(value)` は、ループしている相手に要素を 1 つ発します。\n* `continuation.finish()` は stream を終了し、消費側のループを止めます。\n\n屋上の気象ステーションを配線しましょう。およそ 0.3 秒ごとに測定値を発し、それを 5 回繰り返してから終了します。";
"ProducingWithAsyncStream-2" = "**実行して確認:** 2 つの `print` 行が、一度に 1 組ずつ、およそ 0.3 秒ごとに交互に現れます。`sensor emits reading 1`、続いて `received ...°C`、それから小休止、次に測定値 2、という具合です。5 回目の測定値のあと、`finish()` が stream を終了し、ループが抜け、`Stream finished` が表示されます。文字通り、時間をかけて値が到着する様子を見ているのです。ただの配列では見せられないものです。\n\n* callout(試してみよう): `1...5` を `1...8` に、遅延を `.milliseconds(150)` に変えてみましょう。stream はより多くの測定値を、より速く発するようになります。`finish()` の行は、変わらずきれいに終了させます。\n\nいくつか名前を挙げておく価値のあることがあります。\n\n* クロージャは、待機のために自分自身の `Task` を動かします。`yield` はどこからでも、何度でも呼び出せます。タイマーから、delegate メソッドから、completion handler から。それぞれの呼び出しが、ループに要素を 1 つ届けます。\n* まだ誰も次の値を待っていない場合、`AsyncStream` はそれを**バッファリング**します。そのため、消費側が忙しい間に到着した測定値を失うことはありません。\n* `yield` する値は **`Sendable`** であるべきです。それらは生成側のタスクから消費側のタスクへ飛び移ります。`Double` と `Int` はすでに `Sendable` なので、Swift 6 の data race チェックはここでは静かなままです。\n\n[前へ](@previous)  |  3 / 7 ページ  |  [次へ: onTermination でクリーンアップする](@next)";
