Skip to content

Commit

Permalink
add SepTextWriterDisposers
Browse files Browse the repository at this point in the history
  • Loading branch information
nietras committed Jan 21, 2025
1 parent 1063a20 commit 1417f2f
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 11 deletions.
26 changes: 26 additions & 0 deletions src/Sep/Internals/SepTextWriterDisposers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System.IO;
using System.Threading.Tasks;

namespace nietras.SeparatedValues;

interface ISepTextWriterDisposer
{
void Dispose(TextWriter writer);
ValueTask DisposeAsync(TextWriter writer);
}

sealed class SepTextWriterDisposer : ISepTextWriterDisposer
{
SepTextWriterDisposer() { }
public static SepTextWriterDisposer Instance { get; } = new();
public void Dispose(TextWriter writer) => writer.Dispose();
public ValueTask DisposeAsync(TextWriter writer) => writer.DisposeAsync();
}

sealed class NoopSepTextWriterDisposer : ISepTextWriterDisposer
{
NoopSepTextWriterDisposer() { }
public static NoopSepTextWriterDisposer Instance { get; } = new();
public void Dispose(TextWriter writer) { }
public ValueTask DisposeAsync(TextWriter writer) => ValueTask.CompletedTask;
}
5 changes: 2 additions & 3 deletions src/Sep/SepWriter.IO.Async.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,10 +254,9 @@ async ValueTask DisposeManagedAsync(CancellationToken cancellationToken)
}

#if SYNC
_disposeTextWriter(_writer);
_textWriterDisposer.Dispose(_writer);
#else
// TODO TODO TODO !!!
_disposeTextWriter(_writer);
await _textWriterDisposer.DisposeAsync(_writer);
#endif
_arrayPool.Dispose();
foreach (var col in _colNameToCol.Values)
Expand Down
5 changes: 2 additions & 3 deletions src/Sep/SepWriter.IO.Sync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,10 +254,9 @@ async ValueTask DisposeManagedAsync(CancellationToken cancellationToken)
}

#if SYNC
_disposeTextWriter(_writer);
_textWriterDisposer.Dispose(_writer);
#else
// TODO TODO TODO !!!
_disposeTextWriter(_writer);
await _textWriterDisposer.DisposeAsync(_writer);
#endif
_arrayPool.Dispose();
foreach (var col in _colNameToCol.Values)
Expand Down
6 changes: 3 additions & 3 deletions src/Sep/SepWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public sealed partial class SepWriter : IDisposable
#pragma warning disable CA2213 // Disposable fields should be disposed
readonly TextWriter _writer;
#pragma warning restore CA2213 // Disposable fields should be disposed
readonly Action<TextWriter> _disposeTextWriter;
readonly ISepTextWriterDisposer _textWriterDisposer;
internal readonly List<(string ColName, int ColIndex)> _colNameCache = new(DefaultCapacity);

// TODO: Add Stack<ColImpl> for remove/add cols when manipulating
Expand All @@ -36,7 +36,7 @@ public sealed partial class SepWriter : IDisposable
bool _newRowActive = false;
int _cacheIndex = 0;

internal SepWriter(SepWriterOptions options, TextWriter writer, Action<TextWriter> disposeTextWriter)
internal SepWriter(SepWriterOptions options, TextWriter writer, ISepTextWriterDisposer textWriterDisposer)
{
_sep = options.Sep;
_cultureInfo = options.CultureInfo;
Expand All @@ -45,7 +45,7 @@ internal SepWriter(SepWriterOptions options, TextWriter writer, Action<TextWrite
_colNotSetOption = options.ColNotSetOption;
_escape = options.Escape;
_writer = writer;
_disposeTextWriter = disposeTextWriter;
_textWriterDisposer = textWriterDisposer;
Header = new(this);
}

Expand Down
6 changes: 4 additions & 2 deletions src/Sep/SepWriterExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,10 @@ public static SepWriter To(this SepWriterOptions options, TextWriter writer) =>

public static SepWriter To(this SepWriterOptions options, TextWriter writer, bool leaveOpen)
{
Action<TextWriter> disposeTextWriter = leaveOpen ? static w => { } : static w => w.Dispose();
ISepTextWriterDisposer textWriterDisposer = leaveOpen
? NoopSepTextWriterDisposer.Instance
: SepTextWriterDisposer.Instance;
ArgumentNullException.ThrowIfNull(writer);
return new SepWriter(options, writer, disposeTextWriter);
return new SepWriter(options, writer, textWriterDisposer);
}
}

0 comments on commit 1417f2f

Please sign in to comment.