fsprojects/FSharpx.Collections
63.4
Adequate · 24 September 2026
13.7k
lines of production code
F#
primary language
5
measurements over time
What this system is
This system is a functional programming library for F\# that provides a comprehensive suite of immutable and mutable data structures, including lists, queues, heaps, and trees. It extends standard collections with specialized types like NonEmptyList, DList, and BKTree, alongside experimental implementations for advanced algorithmic needs. The project supports both .NET and JavaScript environments through Fable, ensuring broad compatibility for functional data manipulation.
Features
Add experimental functional data structures
The library now includes a suite of new experimental collection types in the FSharpx.Collections.Experimental namespace, providing alternative implementations for common data structures. These include random access lists (AltBinaryRandomAccessList, BinaryRandomAccessList), queues and deques (BankersQueue, BankersDeque, BatchedQueue, BatchedDeque), a BKTree for distance-based searches, a BlockResizeArray for optimized large array storage, and a BinaryRoseTree for multi-way tree structures. These additions expand the available functional data structures for users requiring specific performance characteristics or algorithmic properties beyond the standard library.
src/FSharpx.Collections.Experimental · high confidence
Introduce NonEmptyList collection with standard functional operations
A new NonEmptyList type has been added to FSharpx.Collections, providing a list structure that guarantees at least one element. This implementation exposes a comprehensive set of functional operations including creation (create, singleton, ofArray, ofList, ofSeq), transformation (map, collect, cons, append, zip, rev), querying (head, tail, length, last, exists, forall, contains, tryFind), and aggregation (reduce, fold, foldBack, max, min, sort, sortBy, sortWith). The type implements standard .NET interfaces (IEnumerable, IReadOnlyCollection) and includes extension methods for seamless integration with F\# sequence syntax.
FSharpx.Collections · high confidence
Introduces new immutable and mutable collection types
The library now includes several new data structures: a mutable CircularBuffer with offset and count validation for enqueuing arrays, a ByteString type providing structural comparison and equality for byte segments, a DList (difference list) supporting O(1) append and standard sequence operations, and a Deque (double-ended queue) with efficient head/tail and last/initial access. These additions expand the available collection types for functional and imperative patterns within FSharpx.Collections.
src/FSharpx.Collections · high confidence
New experimental purely functional data structures
The FSharpx.Collections.Experimental namespace now includes several new purely functional data structures: BinaryTreeZipper for navigating binary trees, BinomialHeap and SkewBinomialHeap as priority queues with O(1) insertion, BootstrappedQueue and RealTimeQueue for amortized O(1) queue operations, ChampHashMap for efficient hash maps, BottomUpMergeSort for sorting, and EagerRoseTree, IndexedRoseTree, and ListZipper for tree and list manipulation.
FSharpx.Collections.Experimental · high confidence
Behavioural changes
Build system migrated to .NET 8 and updated tooling
The build process now targets .NET 8, as evidenced by the test runner looking for assemblies in the net8.0 directory. The FAKE build script has been updated to use Expecto for running unit tests, and the build dependencies (paket.references) have been refreshed to include the necessary Fake modules for .NET CLI, MSBuild, testing, and assembly info generation.
build · high confidence
Repository modernization and infrastructure overhaul
The project has undergone a significant infrastructure update to modernize its development environment and build processes. The solution now targets .NET 8 (SDK 8.0.416) and utilizes Paket for dependency management, replacing older bootstrapping methods. Code formatting is now enforced via Fantomas, with CI checks ensuring consistency. The documentation system has migrated to FsDocs, and the project now supports Fable/JavaScript testing alongside standard .NET tests. Additionally, the license has been updated from the Unlicense to Apache 2.0, and Gitpod support has been added for cloud-based development.
(repo-wide) · high confidence
Test coverage
Added Fable test suite for FSharpx.Collections; Added comprehensive test coverage for experimental collection types; Comprehensive test suite for FSharpx.Collections data structures.
Dependencies
Modernize build infrastructure and upgrade to .NET 8
The build system has been modernized by introducing a new \build/build.fsproj\ project targeting .NET 8.0, which utilizes FAKE 6.1.4 for build automation tasks such as release notes, MSBuild, and testing. The core library projects (\FSharpx.Collections\ and \FSharpx.Collections.Experimental\) and all test suites have been updated to target .NET 8.0 (with Fable tests remaining on netstandard2.0), and the dependency management has shifted to Paket, as evidenced by the new \paket.dependencies\ and \paket.lock\ files. Additionally, the Fable JavaScript test runner has been updated to use Mocha 12.0.0.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 56 → 63 (+7.5)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 67 → 72 (+5.8)
- Architecture 96 → 97 (+0.9)
- Maturity 56 → 56 (+0.3)
- Readiness 48 → 63 (+15.9)
- Security 66 → 74 (+7.9)
Resolved (96)
- Concentrated knowledge decay
- Dependency hygiene not measured — no packages were read
- Duplicated block (10 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (10 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (10 lines × 2) (src/FSharpx.Collections/DList.fs)
- Duplicated block (10 lines × 4) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections.Experimental/DList.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections/PersistentHashMap.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections/PersistentVector.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections/PersistentVector.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections.Experimental/BinomialHeap.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/PersistentVector.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/RandomAccessList.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/RandomAccessList.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections/RandomAccessList.fs)
- …and 76 more
New (125)
- Duplicated block (10 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (10 lines × 3) (src/FSharpx.Collections.Experimental/IntMap.fs)
- Duplicated block (10–11 lines × 2) (src/FSharpx.Collections/PersistentHashMap.fs)
- Duplicated block (10–11 lines × 2) (src/FSharpx.Collections/PersistentHashMap.fs)
- Duplicated block (10–12 lines × 2) (src/FSharpx.Collections.Experimental/DList.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (11 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/PersistentVector.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/PersistentVector.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/PersistentVector.fs)
- Duplicated block (12 lines × 2) (src/FSharpx.Collections/RandomAccessList.fs)
- Duplicated block (12–15 lines × 2) (src/FSharpx.Collections/DList.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections.Experimental/BankersDeque.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections.Experimental/BatchedQueue.fs)
- Duplicated block (13 lines × 2) (src/FSharpx.Collections/PersistentHashMap.fs)
- Duplicated block (13–14 lines × 2) (src/FSharpx.Collections.Experimental/BatchedDeque.fs)
- …and 105 more
Changes since last survey
- 6 commits — 5 feature/other, 1 fixes
By area
- (repo) — 3 commits
- .github/workflows — 2 commits
- tests/fable — 1 commit
Notable commits
- fix: Merge pull request #267 from fsprojects/copilot/fix-dependabot-security-alerts
- change: Initial plan
- change: Merge pull request #242 from fsprojects/repo-assist/perf-heap-ofseq-2026-03-11-ccea0939034d3b00
- change: Upgrade mocha to resolve security vulnerabilities in tests/fable
- change: update repo assist
- change: update repo assist
Architecture
- Unchanged — 1 containers · 2 contexts · 1 edges
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
fsprojects/FSharpx.Collections was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 24 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 1efd7c38ddb7c952b2634544c8a03ac0ae5a9e83 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-923689c465cf.