Skip to content
CAI
Software that uses CAICheck a score

fsprojects/FSharpx.Collections

63.4

Adequate · 24 September 2026

13.7k

lines of production code

F#

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.