Finish PipeWriter implementation

This commit is contained in:
Daniel J. Summers 2025-04-11 11:41:10 -04:00
parent 5eee3ce92a
commit 79ace3ea63

View File

@ -634,6 +634,8 @@ module Query =
|> function it -> $" ORDER BY {it}"
#nowarn "FS3511" // "let rec" is not statically compilable
open System.IO.Pipelines
/// <summary>Functions that manipulate <c>PipeWriter</c>s</summary>
@ -648,8 +650,7 @@ module PipeWriter =
let writeString (writer: PipeWriter) (text: string) = backgroundTask {
try
let! writeResult = writer.WriteAsync(Encoding.UTF8.GetBytes text)
let! flushResult = writer.FlushAsync()
return not (writeResult.IsCompleted || flushResult.IsCompleted)
return not writeResult.IsCompleted
with :? System.ObjectDisposedException -> return false
}
@ -659,19 +660,20 @@ module PipeWriter =
/// <returns><c>true</c> if the pipe is still open, <c>false</c> if not</returns>
[<CompiledName "WriteStrings">]
let writeStrings writer items = backgroundTask {
let rec writeNext docs idx = backgroundTask {
match items |> Seq.tryItem idx with
let theItems = Seq.cache items
let rec writeNext idx = backgroundTask {
match theItems |> Seq.tryItem idx with
| Some item ->
if idx > 0 then
let! _ = writeString writer ","
()
match! writeString writer item with
| true -> return! writeNext docs (idx + 1)
| true -> return! writeNext (idx + 1)
| false -> return false
| None -> return true
}
let! _ = writeString writer "["
let! isCleanFinish = writeNext items 0
let! isCleanFinish = writeNext 0
if isCleanFinish then
let! _ = writeString writer "]"
()