FluentSeq 1.0.0-RC1
See the version list below for details.
dotnet add package FluentSeq --version 1.0.0-RC1
NuGet\Install-Package FluentSeq -Version 1.0.0-RC1
<PackageReference Include="FluentSeq" Version="1.0.0-RC1" />
paket add FluentSeq --version 1.0.0-RC1
#r "nuget: FluentSeq, 1.0.0-RC1"
// Install FluentSeq as a Cake Addin #addin nuget:?package=FluentSeq&version=1.0.0-RC1&prerelease // Install FluentSeq as a Cake Tool #tool nuget:?package=FluentSeq&version=1.0.0-RC1&prerelease
FluentSeq
FluentSeq provides a fluent interface for creating easy-to-read sequences,
eliminating the need for lengthy if/else statements.
The library is written in C# 14 and targets .NET Standard 2.0 (.NET (Core) and .NET Framework).
FluentSeq is the successor of IegTools.Sequencer
The library allows you to configure:
- Sequences with States
- different kinds of State-Triggers
- Actions that can be executed on State-Entry, State-Exit or WhileInState
- Validate a sequence on build
Build Status
Table of Contents
Installation
Usage
States
Validation
Version Changes
Breaking Changes
Preview next Version v2.0
Installation
The library is available as a NuGet package.
Usage
Configure, build and run a sequence
Create a sequence in a compact style
A simple example configuration and usage for an OnTimer-sequence as xUnit-Test:
using FluentSeq.Builder;
using FluentSeq.Core;
public class OnTimerCreateExampleTests
{
private ISequence<TimerState>? _sequence;
private bool _onTimerInput;
private ISequenceBuilder<TimerState> GetOnTimerConfiguration(int dwellTimeInMs) =>
new FluentSeq<TimerState>().Create(TimerState.Off)
.ConfigureState(TimerState.Off)
.TriggeredBy(() => !_onTimerInput)
.ConfigureState(TimerState.Pending)
.TriggeredBy(() => _onTimerInput)
.WhenInState(TimerState.Off)
.ConfigureState(TimerState.On)
.TriggeredBy(() => _onTimerInput)
.WhenInState(TimerState.Pending, () => TimeSpan.FromMilliseconds(dwellTimeInMs))
.Builder();
[Theory]
[InlineData(false, 9, 0, TimerState.Off, TimerState.Off)]
[InlineData(false, 9, 0, TimerState.Pending, TimerState.Off)]
[InlineData(false, 9, 0, TimerState.On, TimerState.Off)]
[InlineData(false, 1, 2, TimerState.Off, TimerState.Off)]
[InlineData(false, 1, 2, TimerState.Pending, TimerState.Off)]
[InlineData(false, 1, 2, TimerState.On, TimerState.Off)]
[InlineData(true, 9, 0, TimerState.Off, TimerState.Pending)]
[InlineData(true, 9, 0, TimerState.Pending, TimerState.Pending)]
[InlineData(true, 9, 0, TimerState.On, TimerState.On)]
[InlineData(true, 1, 2, TimerState.Off, TimerState.Pending)]
[InlineData(true, 1, 2, TimerState.Pending, TimerState.On)]
[InlineData(true, 1, 2, TimerState.On, TimerState.On)]
public async Task Example_Usage_OnTimerConfiguration_Run_async(bool timerInput, int dwellTimeInMs, int sleepTimeInMs, TimerState currentState, TimerState expectedState)
{
_sequence = GetOnTimerConfiguration(dwellTimeInMs).Build();
_onTimerInput = timerInput;
_sequence.SetState(currentState);
await Task.Delay(sleepTimeInMs);
await _sequence.RunAsync();
var actual = _sequence.CurrentState;
actual.ShouldBe(expectedState);
}
}
Configure a sequence in a detailed style
A simple example configuration and usage for an OffTimer-sequence as xUnit-Test:
using FluentSeq.Builder;
using FluentSeq.Core;
public class OffTimerConfigureExampleTests
{
private ISequence<TimerState>? _sequence;
private bool _onTimerInput;
private ISequenceBuilder<TimerState> GetOffTimerConfiguration(int dwellTimeInMs) =>
new FluentSeq<TimerState>().Configure(TimerState.Off, builder =>
{
builder.ConfigureState(TimerState.On)
.TriggeredBy(() => _onTimerInput);
builder.ConfigureState(TimerState.Pending)
.TriggeredBy(() => !_onTimerInput)
.WhenInState(TimerState.On);
builder.ConfigureState(TimerState.Off)
.TriggeredBy(() => !_onTimerInput)
.WhenInState(TimerState.Pending, () => TimeSpan.FromMilliseconds(dwellTimeInMs));
}).Builder();
[Theory]
[InlineData(true, 9, 0, TimerState.Off, TimerState.On)]
[InlineData(true, 9, 0, TimerState.Pending, TimerState.On)]
[InlineData(true, 9, 0, TimerState.On, TimerState.On)]
[InlineData(true, 1, 2, TimerState.Off, TimerState.On)]
[InlineData(true, 1, 2, TimerState.Pending, TimerState.On)]
[InlineData(true, 1, 2, TimerState.On, TimerState.On)]
[InlineData(false, 9, 0, TimerState.Off, TimerState.Off)]
[InlineData(false, 9, 0, TimerState.Pending, TimerState.Pending)]
[InlineData(false, 9, 0, TimerState.On, TimerState.Pending)]
[InlineData(false, 1, 2, TimerState.Off, TimerState.Off)]
[InlineData(false, 1, 2, TimerState.Pending, TimerState.Off)]
[InlineData(false, 1, 2, TimerState.On, TimerState.Pending)]
public async Task Example_Usage_OffTimerConfiguration_Run_async(bool timerInput, int dwellTimeInMs, int sleepTimeInMs, TimerState currentState, TimerState expectedState)
{
_sequence = GetOffTimerConfiguration(dwellTimeInMs).Build();
_onTimerInput = timerInput;
_sequence.SetState(currentState);
await Task.Delay(sleepTimeInMs);
await _sequence.RunAsync();
var actual = _sequence.CurrentState;
actual.ShouldBe(expectedState);
}
}
For more examples → IntegrationsTestsFluentSeq/Examples
Configurations in Detail
TBD
States
States can be defined as strings, enums, int, objects...
Validation
The sequence will be validated on build.
_sequence = builder.Build();
Validations:
- The InitialState must be defined (not null or empty)
- The InitialState must be configured
- Every State must have a TriggeredBy(...)
- A Sequence must at least have configured two States
Validation could be disabled
completely turn off validation
builder.DisableValidation()
or with specifying states that shouldn't be validated:
builder.DisableValidationForStates("state1", "state2", ...)
builder.DisableValidationForStates(Enum.State1, Enum.State2, ...)
Version Changes
Breaking Changes
Preview next Version v2
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- FluentValidation (>= 11.11.0)
- JetBrains.Annotations (>= 2024.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.3-pre1 | 69 | 3/8/2025 |
1.0.2-RC1 | 148 | 3/5/2025 |
1.0.0-RC1 | 154 | 3/5/2025 |
v1.0.0-RC1 kickoff