Skip to content
CAI
Software that uses CAICheck a score

CombineCommunity/CombineExt

66.8

Adequate · 1 October 2026

3k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

CombineExt is a Swift library that extends Apple's Combine framework with additional operators, publishers, and utilities for iOS, macOS, tvOS, and watchOS. It provides advanced reactive programming features such as backpressure management, event materialization, and specialized subject types like Relay and ReplaySubject. The system also includes internal concurrency primitives and scheduler enhancements to improve testability and thread safety.

Features

Add CurrentValueRelay and PassthroughRelay for Combine

This change introduces two new Combine-compatible relay types in the Sources/Relays module: CurrentValueRelay, which maintains and broadcasts the most recently published value, and PassthroughRelay, which broadcasts values without buffering. Both types implement the new Relay protocol, allowing external callers to publish values via an accept method while ensuring that completion events are only sent upon deallocation, preventing premature termination of subscriptions.

Sources/Relays · high confidence

Add ReplaySubject for buffering and replaying values

Introduces a new \ReplaySubject\ class in the \Sources/Subjects\ module that buffers up to a specified number of values and replays them to new subscribers. The implementation uses a recursive lock to ensure thread safety when sending values, completion events, or managing subscriptions, and it forwards buffered values and completion states to any subscriber that connects after the subject has already emitted data.

Sources/Subjects · high confidence

Added Xcode workspace configuration for Swift Package Manager

A new \contents.xcworkspacedata\ file has been added to the \.swiftpm/xcode/package.xcworkspace\ directory. This file configures the Xcode workspace to reference the local package, enabling developers to open and edit the Swift package directly within Xcode for easier debugging and integration.

.swiftpm · high confidence

Added internal concurrency primitives for Combine schedulers

Added internal \Lock\ and \Timer\ implementations to support Combine scheduler operations. The new \Lock\ file provides a wrapper around \os\_unfair\_lock\ for thread-safe synchronization, while \Timer.swift\ introduces a \Publishers.Timer\ extension that allows timers to operate on any \Scheduler\ rather than just the \RunLoop\, significantly improving testability by enabling time simulation in tests.

Sources/Operators/Internal · high confidence

Initial release of CombineExt with SPM support and tooling configuration

This entry marks the initial public release of CombineExt (version 1.0.0), a library providing additional Combine operators, publishers, and utilities. The repository is now configured for Swift Package Manager (SPM) installation, targeting iOS 13, macOS 10.15, tvOS 13, and watchOS 6. The release includes configuration files for SwiftLint, SwiftFormat, and mise (for tooling versions), along with a Makefile for testing and formatting, and Codecov integration for coverage tracking. The library exposes operators such as \withLatestFrom\, \amb\, \partition\, and \assign\, as well as publishers like \CurrentValueRelay\ and \PassthroughRelay\.

(repo-wide) · high confidence

Introduces backpressure-aware Sink and DemandBuffer for Combine

Adds a new \Sink\ subscriber and \DemandBuffer\ helper in the Common module to manage backpressure more effectively. The \DemandBuffer\ tracks downstream demand and buffers upstream values, ensuring that events are only forwarded when the subscriber is ready, while the \Sink\ class uses this buffer to handle output and failure transformations safely. This change improves the reliability of Combine pipelines by preventing data loss or memory issues during high-throughput scenarios.

Sources/Common · high confidence

New Combine operators and model types for event handling and publisher composition

This update introduces a suite of new capabilities to the CombineExt library, centered around the \Sources/Operators\ directory. It adds the \Event\ model and \EventConvertible\ protocol to represent and handle publisher events explicitly, enabling the new \materialize()\, \dematerialize()\, \values()\, and \failures()\ operators. Publisher composition is expanded with \amb()\ (race), \flatMapBatches(of:)\, \flatMapFirst\, \filterMany\, \mapMany\, \nwise\, \pairwise\, \partition\, \prefix(duration:on:)\, \prefix(while:)\, \enumerated\, and variadic \combineLatest\ overloads. Error and output handling is enhanced with \ignoreFailure\, \ignoreOutput(setOutputType:)\, \mapToResult\, \mapToVoid\, and \mapToValue(\_:)\. Additionally, \assign\ operators now support \ObjectOwnership\ (strong, weak, unowned) for safer property assignment, and \AnyPublisher.create\ provides a factory-based publisher construction with cancellation handling.

Sources/Operators · high confidence

Behavioural changes

Deprecation of Optional.publisher in favor of native Combine

The \Optional.publisher\ convenience property in the \Sources/Convenience\ module is now deprecated and marked as obsoleted on macOS 11.0, iOS 14.0, tvOS 14.0, and watchOS 7.0, with a message indicating that this functionality is now part of the standard Combine framework. Users should migrate to the native \Optional.publisher\ provided by Apple's Combine library on supported platforms.

Sources/Convenience · high confidence

Test coverage

Added test coverage for new Combine operators and behaviors

This update adds comprehensive unit tests for several new CombineExt capabilities, including the \amb\ operator (with variadic support), \assign\ with explicit ownership control (strong, weak, unowned) to multiple targets, and collection-based \combineLatest\. It also introduces tests for the \create\ publisher's cancellation handling, \dematerialize\, \enumerated\, \filterMany\, \flatMapBatches\, \flatMapFirst\, \flatMapLatest\, \ignoreFailure\, \ignoreOutput\, \mapMany\, and \mapToResult\. Additionally, it includes tests for \CurrentValueRelay\ subscription behaviors and memory management, ensuring correct replay and leak-free operation.

Tests · high confidence

Dependencies

Migrate to Swift 6 and update dependencies

The project has been upgraded to Swift 6 language mode and updated its minimum platform deployment targets (iOS/tvOS 13, macOS 10.15, watchOS 6). The dependency on \combine-schedulers\ has been updated to version 1.1.0, and the package manifest now includes a \Package.resolved\ file pinning specific versions for \combine-schedulers\, \swift-concurrency-extras\, and \xctest-dynamic-overlay\.

(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 65 → 67 (+2.3)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 99 → 98 (-1.2)
  • Architecture 100 → 100 (+0.0)
  • Maturity 51 → 55 (+3.9)
  • Readiness 55 → 60 (+5.3)
  • Security 92 → 92 (+0.0)

Resolved (3)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Off-boarding risk: anonymized user #1

New (5)

  • Coverage not measured — Swift suite
  • Duplicated block (12–13 lines × 2) (Sources/Operators/CombineLatestMany.swift)
  • Off-boarding risk: anonymized user #1
  • Outdated: combine-schedulers
  • TooManyMethods: Publisher (Sources/Operators/Amb.swift)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

CombineCommunity/CombineExt 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 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 96a7610ca165e027b24710fc2f04c9ba8d2ce0e6 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.