FluentSeq 1.0.3-pre1
dotnet add package FluentSeq --version 1.0.3-pre1
NuGet\Install-Package FluentSeq -Version 1.0.3-pre1
<PackageReference Include="FluentSeq" Version="1.0.3-pre1" />
paket add FluentSeq --version 1.0.3-pre1
#r "nuget: FluentSeq, 1.0.3-pre1"
// Install FluentSeq as a Cake Addin #addin nuget:?package=FluentSeq&version=1.0.3-pre1&prerelease // Install FluentSeq as a Cake Tool #tool nuget:?package=FluentSeq&version=1.0.3-pre1&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 to avoid misconfigurations (missing states, triggers, etc.)
Build Status
Table of Contents
Installation
Usage
States
Trigger
Actions
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
Configuration in Detail
States
States can be defined as strings, enums, int, objects, and so on.
Internally they will be stored as type SeqState.
var builder = new FluentSeq<TimerState>().Create(TimerState.Off)
.ConfigureState(TimerState.Off)
.Builder()
// or
var builder = new FluentSeq<string>().Create("Off")
.ConfigureState("Off")
.Builder()
Trigger
TBD
Actions
TBD
Sequence Validation
The validation process ensures the sequence configuration is complete and adheres to the defined principles.
By default, validation is enabled but can be disabled either entirely or for specific states.
The sequence is validated during the build process.
To build a sequence:
_sequence = builder.Build();
Validation Principles:
- A Sequence must at least have two configured States
- The InitialState must be defined and configured (not null or empty)
- Every State must have a TriggeredBy(...)
- Every TriggeredBy().WhenInState(s)(...) must have a configured State
Validation could be disabled:
- completely turn off validation
var builder = new FluentSeq<TimerState>().Create(TimerState.Off)
.DisableValidation()
.ConfigureState(TimerState.Off)
.Builder()
- or with specifying states that shouldn't be validated:
var builder = new FluentSeq<TimerState>().Create(Enum.Off)
.DisableValidationForStates(Enum.State1, Enum.State2, ...)
.ConfigureState(Enum.Off)
.Builder()
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 |
1.0.3-pre1