Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ root = true
# Default settings
#############################################
[*]
end_of_line = crlf
insert_final_newline = true
indent_style = space
indent_size = 4
Expand Down Expand Up @@ -2154,7 +2155,7 @@ indent_size = 2
# Shell Scripts
#############################################
[*.sh]
end_of_line = lf
end_of_line = crlf

[*.{cmd, bat}]
end_of_line = crlf
6 changes: 3 additions & 3 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Auto-detect text files and normalise line endings to LF in the repository.
* text=auto
# Auto-detect text files and normalise line endings to CRLF in the repository.
* text=auto eol=crlf

# Source code
*.cs text diff=csharp
Expand All @@ -15,7 +15,7 @@
*.yaml text
*.md text
*.txt text
*.sh text eol=lf
*.sh text eol=crlf
*.ps1 text
*.cmd text eol=crlf
*.bat text eol=crlf
Expand Down
20 changes: 0 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -651,29 +651,9 @@ Performance constraints used by the project:
| `src/ReactiveUI.Primitives.R3Bridge.Generator` | Source generator for R3 bridge adapters. |
| `src/ReactiveUI.Primitives.Tests` | Test project using Microsoft Testing Platform/TUnit-style validation. |
| `src/benchmarks/ReactiveUI.Primitives.Benchmarks` | BenchmarkDotNet comparison harness. |
| `docs/API-COVERAGE.md` | Public API inventory and parity notes. |
| `docs/PERFORMANCE.md` | Benchmark plan and recovered benchmark evidence. |
| `docs/TASKLIST.md` | Project task/status notes. |
| `docs/research` | System.Reactive and R3 API inventory research. |

## Validation commands

From WSL, use Windows dotnet for this repository:

```bash
"/mnt/c/Program Files/dotnet/dotnet.exe" restore src/ReactiveUI.Primitives.sln
"/mnt/c/Program Files/dotnet/dotnet.exe" build src/ReactiveUI.Primitives.sln --configuration Release --no-restore
"/mnt/c/Program Files/dotnet/dotnet.exe" test --project src/ReactiveUI.Primitives.Tests/ReactiveUI.Primitives.Tests.csproj --configuration Release --no-build -- --minimum-expected-tests 1
"/mnt/c/Program Files/dotnet/dotnet.exe" pack src/ReactiveUI.Primitives/ReactiveUI.Primitives.csproj --configuration Release --no-restore -v minimal
git diff --check
```

To run the focused benchmark used by the performance notes:

```bash
"/mnt/c/Program Files/dotnet/dotnet.exe" run --project src/benchmarks/ReactiveUI.Primitives.Benchmarks/ReactiveUI.Primitives.Benchmarks.csproj --configuration Release --no-build -- --filter '*SubjectThroughput*'
```

For NuGet package verification, inspect the generated `.nupkg` and confirm:

- `README.md` is present.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// CurrentThreadSequencer.
/// </summary>
/// <seealso cref="ReactiveUI.Primitives.Concurrency.ISequencer" />
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class CurrentThreadSequencer : ISequencer
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// DispatcherSequencer.
/// </summary>
/// <seealso cref="ReactiveUI.Primitives.Concurrency.ISequencer" />
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class DispatcherSequencer : ISequencer
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// ImmediateSequencer.
/// </summary>
/// <seealso cref="ReactiveUI.Primitives.Concurrency.ISequencer" />
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class ImmediateSequencer : ISequencer
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Concurrency/ScheduledItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// Abstract base class for scheduled work items.
/// </summary>
/// <typeparam name="TAbsolute">Absolute time representation type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public abstract class ScheduledItem<TAbsolute> : IScheduledItem<TAbsolute>, IComparable<ScheduledItem<TAbsolute>>, IsDisposed, IComparable
where TAbsolute : IComparable<TAbsolute>
{
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Concurrency/Sequencer.Simple.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// <summary>
/// Sequencer.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public static partial class Sequencer
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Concurrency/SequencerQueue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// </summary>
/// <typeparam name="TAbsolute">Absolute time representation type.</typeparam>
/// <remarks>This type is not thread safe; users should ensure proper synchronization.</remarks>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class SequencerQueue<TAbsolute>
where TAbsolute : IComparable<TAbsolute>
{
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Concurrency/TaskPoolSequencer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// TaskPoolSequencer.
/// </summary>
/// <seealso cref="ReactiveUI.Primitives.Concurrency.ISequencer" />
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class TaskPoolSequencer : ISequencer
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Concurrency/TestClock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// <summary>
/// Test-facing alias for <see cref="VirtualClock"/>.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class TestClock : VirtualClock
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Concurrency
/// ThreadPoolSequencer.
/// </summary>
/// <seealso cref="ReactiveUI.Primitives.Concurrency.ISequencer" />
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class ThreadPoolSequencer : ISequencer
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// </summary>
/// <typeparam name="TAbsolute">Absolute time representation type.</typeparam>
/// <typeparam name="TRelative">Relative time representation type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public abstract class VirtualTimeSequencerBase<TAbsolute, TRelative> : ISequencer, IServiceProvider, IStopwatchProvider
where TAbsolute : IComparable<TAbsolute>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// <summary>
/// Provides a set of extension methods for virtual time scheduling.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public static class VirtualTimeSequencerExtensions
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace ReactiveUI.Primitives.Concurrency;
/// </summary>
/// <typeparam name="TAbsolute">Absolute time representation type.</typeparam>
/// <typeparam name="TRelative">Relative time representation type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public abstract class VirtualTimeSequencer<TAbsolute, TRelative> : VirtualTimeSequencerBase<TAbsolute, TRelative>
where TAbsolute : IComparable<TAbsolute>
{
Expand Down
2 changes: 0 additions & 2 deletions src/ReactiveUI.Primitives/ConnectableSignal{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ namespace ReactiveUI.Primitives;
/// Connectable hot signal that subscribes to its source only when connected.
/// </summary>
/// <typeparam name="T">The value type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class ConnectableSignal<T> : IObservable<T>
{
/// <summary>
Expand Down Expand Up @@ -79,7 +78,6 @@ public IDisposable Connect()
/// <summary>
/// Hot-sharing operators for Primitives connectable signals.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public static class ConnectableSignalMixins
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/DisposedWitness{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace ReactiveUI.Primitives.Core;
/// Observer that rejects every notification because the subscription has already been disposed.
/// </summary>
/// <typeparam name="T">The observed value type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class DisposedWitness<T> : IObserver<T>
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/EmptyWitness{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives.Core;
/// Delegate-backed observer that defaults missing handlers to no-op behavior.
/// </summary>
/// <typeparam name="T">The observed value type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class EmptyWitness<T> : IObserver<T>
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/ImmutableList{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace ReactiveUI.Primitives.Core;
/// Immutable array-backed list optimized for copy-on-write observer storage.
/// </summary>
/// <typeparam name="T">The item type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class ImmutableList<T>
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/PriorityQueue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace ReactiveUI.Primitives.Core;
/// Binary heap priority queue that preserves insertion order for equal-priority items.
/// </summary>
/// <typeparam name="T">The queued item type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class PriorityQueue<T>
where T : IComparable<T>
{
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/Spark{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ namespace ReactiveUI.Primitives.Core
/// </summary>
/// <typeparam name="T">The type of the elements received by the observer.</typeparam>
[Serializable]
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public abstract class Spark<T> : IEquatable<Spark<T>>
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/ThrowWitness{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace ReactiveUI.Primitives.Core;
/// Observer that ignores values and completion and rethrows errors.
/// </summary>
/// <typeparam name="T">The observed value type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class ThrowWitness<T> : IObserver<T>
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Core/Witness.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives.Core;
/// <summary>
/// Factory methods for allocation-conscious observers in the ReactiveUI.Primitives vocabulary.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public static class Witness
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Disposables/AssignmentSlot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace ReactiveUI.Primitives.Disposables;
/// <summary>
/// Primitives alias for a single-assignment disposable slot.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class AssignmentSlot : SingleDisposable
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace ReactiveUI.Primitives.Disposables;
/// <summary>
/// A disposable pocket that contains a set of disposables and disposes them together.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class MultipleDisposable : IsDisposed
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Disposables/SingleDisposable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace ReactiveUI.Primitives.Disposables;
/// <summary>
/// Single-assignment disposable slot.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class SingleDisposable : IsDisposed
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace ReactiveUI.Primitives.Disposables;
/// <summary>
/// SingleReplaceableDisposable.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class SingleReplaceableDisposable : IsDisposed
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Disposables/Slot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace ReactiveUI.Primitives.Disposables;
/// <summary>
/// Primitives alias for a replaceable disposable slot.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class Slot : SingleReplaceableDisposable
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/LinqMixins.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives;
/// <summary>
/// SelectMixins.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public static partial class LinqMixins
{
/// <summary>
Expand Down
7 changes: 7 additions & 0 deletions src/ReactiveUI.Primitives/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Copyright (c) 2019-2026 ReactiveUI Association Incorporated. All rights reserved.
// ReactiveUI Association Incorporated licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("ReactiveUI.Primitives.Tests")]
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Signal/AsyncSignal{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ namespace ReactiveUI.Primitives.Signals;
/// </summary>
/// <typeparam name="T">The Type.</typeparam>
/// <seealso cref="ReactiveUI.Primitives.Signals.ISignal&lt;T&gt;" />
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class AsyncSignal<T> : IAwaitSignal<T>
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Signal/BehaviourSignal{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Signals;
/// BehaviourSignal.
/// </summary>
/// <typeparam name="T">The Type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class BehaviourSignal<T> : ISignal<T>
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace ReactiveUI.Primitives.Signals;
/// </summary>
/// <typeparam name="T">The T type.</typeparam>
/// <typeparam name="TResult">The TResult type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class BufferSignal<T, TResult> : Signal<TResult>
where TResult : class, IList<T>
{
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Signal/CommandSignal{TResult}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives.Signals;
/// Minimal reactive command that gates execution and publishes result, fault, and running state streams.
/// </summary>
/// <typeparam name="TResult">The command result type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class CommandSignal<TResult> : IDisposable
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Signal/KeepSignal{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives.Signals;
/// Represents the KeepSignal class.
/// </summary>
/// <typeparam name="T">The T type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class KeepSignal<T> : IRequireCurrentThread<T>
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ namespace ReactiveUI.Primitives.Signals;
/// </summary>
/// <typeparam name="TSource">The TSource type.</typeparam>
/// <typeparam name="TResult">The TResult type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal sealed class MapSignal<TSource, TResult> : IRequireCurrentThread<TResult>
{
/// <summary>
Expand Down
2 changes: 0 additions & 2 deletions src/ReactiveUI.Primitives/Signal/ReadOnlyState{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace ReactiveUI.Primitives.Signals;
/// Read-only latest-value signal for projected or externally owned state.
/// </summary>
/// <typeparam name="T">The value type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public sealed class ReadOnlyState<T> : IObservable<T>, IDisposable
{
/// <summary>
Expand Down Expand Up @@ -68,7 +67,6 @@ public void Dispose()
/// <summary>
/// State projection helpers.
/// </summary>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public static class StateSignalMixins
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/ReactiveUI.Primitives/Signal/ReplaySignal{T}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ namespace ReactiveUI.Primitives.Signals;
/// ReplaySignal.
/// </summary>
/// <typeparam name="T">The Type.</typeparam>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class ReplaySignal<T> : ISignal<T>
{
/// <summary>
Expand Down
Loading
Loading