FSharp.Control.TaskSeq is an F# library providing a taskSeq computation expression for IAsyncEnumerable<'T>, along with a comprehensive TaskSeq module of combinators. It targets netstandard2.1.
src/FSharp.Control.TaskSeq/— Main library (netstandard2.1)src/FSharp.Control.TaskSeq.Test/— xUnit test project (net9.0)src/FSharp.Control.TaskSeq.SmokeTests/— Smoke/integration testssrc/FSharp.Control.TaskSeq.sln— Solution fileVersion.props— Single source of truth for the package versionbuild.cmd— Windows build/test script used by CI
The solution uses the .NET SDK. Restore tools first, then build:
dotnet tool restore
dotnet build src/FSharp.Control.TaskSeq.sln -c ReleaseOr use the provided script (Windows):
./build.cmd # default: release build
./build.cmd debug # debug buildbuild.cmd modes: build (default), test, ci. Configurations: release (default), debug.
Tests use xUnit with FsUnit.xUnit assertions. The test project is at src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj.
Run tests locally:
dotnet test src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj -c ReleaseOr via the build script:
./build.cmd test # runs tests without TRX logging
./build.cmd test -debug # debug configuration
./build.cmd ci # CI mode: adds --blame-hang-timeout 60000ms and TRX logging
./build.cmd ci -release # CI mode, release config
./build.cmd ci -debug # CI mode, debug configCI runs both debug and release test configurations on windows-latest. Test results are output as TRX files to src/FSharp.Control.TaskSeq.Test/TestResults/.
Formatting is enforced by Fantomas (version 6.3.0-alpha-004, configured as a dotnet local tool).
Check formatting (CI runs this on every PR):
dotnet tool restore
dotnet fantomas . --checkApply formatting:
dotnet fantomas .Fantomas settings are in src/.editorconfig under the [*.{fs,fsx}] section. Key settings:
max_line_length = 140indent_size = 4fsharp_space_before_parameter = truefsharp_space_before_lowercase_invocation = truefsharp_max_if_then_else_short_width = 60fsharp_max_record_width = 80fsharp_max_array_or_list_width = 100
All workflows are in .github/workflows/:
| Workflow | File | Trigger | Purpose |
|---|---|---|---|
| ci-build | build.yaml |
Pull requests | Verify formatting (dotnet fantomas . --check) then build release on Windows |
| ci-test | test.yaml |
Pull requests | Run tests in both debug and release on Windows, upload TRX artifacts |
| ci-report | test-report.yaml |
After ci-test completes |
Publish test results via dorny/test-reporter |
| Build main | main.yaml |
Push to main |
Build + test release on Windows |
| Publish | publish.yaml |
Push to main |
Build, then push NuGet package (skip-duplicate) |
- F# source files use
.fsextension; signature files use.fsi. TreatWarningsAsErrorsis enabled for all projects.- File ordering matters in F# — the
<Compile>order in.fsprojfiles defines compilation order. - The library targets
netstandard2.1; tests targetnet9.0withFSharp.Corepinned to6.0.1(intentional: ensures compatibility with the minimum supported version). - NuGet packages are output to the
packages/directory.
Required: Every PR that adds features, fixes bugs, or makes user-visible changes must include an update to release-notes.txt. Add a bullet under the appropriate version heading (currently 0.5.0). The format is:
0.5.0
- adds TaskSeq.myFunction and TaskSeq.myFunctionAsync, #<issue>
- fixes <description>, #<issue>
If you are bumping to a new version, also update Version.props. PRs that touch library source (src/FSharp.Control.TaskSeq/) without updating release-notes.txt are incomplete.