Skip to content

Commit 7d8ce82

Browse files
committed
Added bool operations for CurrentValuePublisher
1 parent d0e74f9 commit 7d8ce82

2 files changed

Lines changed: 159 additions & 127 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import Combine
2+
3+
extension CurrentValuePublisher where Output == Bool {
4+
5+
/// Returns a new `CurrentValuePublisher` that computes the logical AND of the current value
6+
/// and subsequent values of this publisher with those of another `CurrentValuePublisher`.
7+
///
8+
/// The resulting publisher emits `true` only when the latest values from both publishers
9+
/// are `true`.
10+
///
11+
/// - Parameter other: Another `CurrentValuePublisher` of `Bool` to combine with.
12+
/// - Returns: A `CurrentValuePublisher` that emits the logical AND of the latest values.
13+
public func and(
14+
_ other: CurrentValuePublisher<Bool, Failure>
15+
) -> CurrentValuePublisher<Bool, Failure> {
16+
return self.combineLatest(other).map { $0 && $1 }
17+
}
18+
19+
/// Returns a new `CurrentValuePublisher` that computes the logical OR of the current value
20+
/// and subsequent values of this publisher with those of another `CurrentValuePublisher`.
21+
///
22+
/// The resulting publisher emits `true` if the latest value from either publisher is `true`.
23+
///
24+
/// - Parameter other: Another `CurrentValuePublisher` of `Bool` to combine with.
25+
/// - Returns: A `CurrentValuePublisher` that emits the logical OR of the latest values.
26+
public func or(
27+
_ other: CurrentValuePublisher<Bool, Failure>
28+
) -> CurrentValuePublisher<Bool, Failure> {
29+
return self.combineLatest(other).map { $0 || $1 }
30+
}
31+
32+
}

Tests/CombineExtensionsTests/CurrentValuePublisher/CurrentValuePublisherTests.swift

Lines changed: 127 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -723,133 +723,133 @@ class CurrentValuePublisherTests: XCTestCase {
723723
XCTAssertEqual(values, [[100, 200], [101, 200], [102, 200], [102, 201]])
724724
}
725725

726-
// // ============================================================================ //
727-
// // MARK: - Boolean Operators
728-
// // ============================================================================ //
729-
//
730-
// func testBooleanAnd_constants() {
731-
// var cancellables = Set<AnyCancellable>()
732-
// var values = [Bool]()
733-
//
734-
// let publisher1 = CurrentValuePublisher<Bool, Never>(value: false)
735-
// let publisher2 = CurrentValuePublisher<Bool, Never>(value: true)
736-
//
737-
// publisher1.and(publisher2)
738-
// .sink { values.append($0) }
739-
// .store(in: &cancellables)
740-
//
741-
// XCTAssertEqual(values, [false])
742-
// }
743-
//
744-
// func testBooleanAnd_subjectAndConstant() {
745-
// var cancellables = Set<AnyCancellable>()
746-
// var values = [Bool]()
747-
//
748-
// let subject1 = CurrentValueSubject<Bool, Never>(false)
749-
// let publisher1 = CurrentValuePublisher(subject1)
750-
//
751-
// let publisher2 = CurrentValuePublisher<Bool, Never>(value: true)
752-
//
753-
// publisher1.and(publisher2)
754-
// .sink { values.append($0) }
755-
// .store(in: &cancellables)
756-
//
757-
// XCTAssertEqual(values, [false])
758-
//
759-
// subject1.value = true
760-
// XCTAssertEqual(values, [false, true])
761-
//
762-
// subject1.value = false
763-
// XCTAssertEqual(values, [false, true, false])
764-
// }
765-
//
766-
// func testBooleanAnd_subjects() {
767-
// var cancellables = Set<AnyCancellable>()
768-
// var values = [Bool]()
769-
//
770-
// let subject1 = CurrentValueSubject<Bool, Never>(false)
771-
// let publisher1 = CurrentValuePublisher(subject1)
772-
//
773-
// let subject2 = CurrentValueSubject<Bool, Never>(false)
774-
// let publisher2 = CurrentValuePublisher(subject2)
775-
//
776-
// publisher1.and(publisher2)
777-
// .sink { values.append($0) }
778-
// .store(in: &cancellables)
779-
//
780-
// XCTAssertEqual(values, [false])
781-
//
782-
// subject1.value = true
783-
// XCTAssertEqual(values, [false, false])
784-
//
785-
// subject2.value = true
786-
// XCTAssertEqual(values, [false, false, true])
787-
//
788-
// subject1.value = false
789-
// XCTAssertEqual(values, [false, false, true, false])
790-
// }
791-
//
792-
// func testBooleanOr_constants() {
793-
// var cancellables = Set<AnyCancellable>()
794-
// var values = [Bool]()
795-
//
796-
// let publisher1 = CurrentValuePublisher<Bool, Never>(value: false)
797-
// let publisher2 = CurrentValuePublisher<Bool, Never>(value: true)
798-
//
799-
// publisher1.or(publisher2)
800-
// .sink { values.append($0) }
801-
// .store(in: &cancellables)
802-
//
803-
// XCTAssertEqual(values, [true])
804-
// }
805-
//
806-
// func testBooleanOr_subjectAndConstant() {
807-
// var cancellables = Set<AnyCancellable>()
808-
// var values = [Bool]()
809-
//
810-
// let subject1 = CurrentValueSubject<Bool, Never>(false)
811-
// let publisher1 = CurrentValuePublisher(subject1)
812-
//
813-
// let publisher2 = CurrentValuePublisher<Bool, Never>(value: false)
814-
//
815-
// publisher1.or(publisher2)
816-
// .sink { values.append($0) }
817-
// .store(in: &cancellables)
818-
//
819-
// XCTAssertEqual(values, [false])
820-
//
821-
// subject1.value = true
822-
// XCTAssertEqual(values, [false, true])
823-
//
824-
// subject1.value = false
825-
// XCTAssertEqual(values, [false, true, false])
826-
// }
827-
//
828-
// func testBooleanOr_subjects() {
829-
// var cancellables = Set<AnyCancellable>()
830-
// var values = [Bool]()
831-
//
832-
// let subject1 = CurrentValueSubject<Bool, Never>(true)
833-
// let publisher1 = CurrentValuePublisher(subject1)
834-
//
835-
// let subject2 = CurrentValueSubject<Bool, Never>(true)
836-
// let publisher2 = CurrentValuePublisher(subject2)
837-
//
838-
// publisher1.or(publisher2)
839-
// .sink { values.append($0) }
840-
// .store(in: &cancellables)
841-
//
842-
// XCTAssertEqual(values, [true])
843-
//
844-
// subject1.value = false
845-
// XCTAssertEqual(values, [true, true])
846-
//
847-
// subject2.value = false
848-
// XCTAssertEqual(values, [true, true, false])
849-
//
850-
// subject1.value = true
851-
// XCTAssertEqual(values, [true, true, false, true])
852-
// }
726+
// ============================================================================ //
727+
// MARK: - Boolean Operators
728+
// ============================================================================ //
729+
730+
func testBooleanAnd_constants() {
731+
var cancellables = Set<AnyCancellable>()
732+
var values = [Bool]()
733+
734+
let publisher1 = CurrentValuePublisher<Bool, Never>(value: false)
735+
let publisher2 = CurrentValuePublisher<Bool, Never>(value: true)
736+
737+
publisher1.and(publisher2)
738+
.sink { values.append($0) }
739+
.store(in: &cancellables)
740+
741+
XCTAssertEqual(values, [false])
742+
}
743+
744+
func testBooleanAnd_subjectAndConstant() {
745+
var cancellables = Set<AnyCancellable>()
746+
var values = [Bool]()
747+
748+
let subject1 = CurrentValueSubject<Bool, Never>(false)
749+
let publisher1 = CurrentValuePublisher(subject1)
750+
751+
let publisher2 = CurrentValuePublisher<Bool, Never>(value: true)
752+
753+
publisher1.and(publisher2)
754+
.sink { values.append($0) }
755+
.store(in: &cancellables)
756+
757+
XCTAssertEqual(values, [false])
758+
759+
subject1.value = true
760+
XCTAssertEqual(values, [false, true])
761+
762+
subject1.value = false
763+
XCTAssertEqual(values, [false, true, false])
764+
}
765+
766+
func testBooleanAnd_subjects() {
767+
var cancellables = Set<AnyCancellable>()
768+
var values = [Bool]()
769+
770+
let subject1 = CurrentValueSubject<Bool, Never>(false)
771+
let publisher1 = CurrentValuePublisher(subject1)
772+
773+
let subject2 = CurrentValueSubject<Bool, Never>(false)
774+
let publisher2 = CurrentValuePublisher(subject2)
775+
776+
publisher1.and(publisher2)
777+
.sink { values.append($0) }
778+
.store(in: &cancellables)
779+
780+
XCTAssertEqual(values, [false])
781+
782+
subject1.value = true
783+
XCTAssertEqual(values, [false, false])
784+
785+
subject2.value = true
786+
XCTAssertEqual(values, [false, false, true])
787+
788+
subject1.value = false
789+
XCTAssertEqual(values, [false, false, true, false])
790+
}
791+
792+
func testBooleanOr_constants() {
793+
var cancellables = Set<AnyCancellable>()
794+
var values = [Bool]()
795+
796+
let publisher1 = CurrentValuePublisher<Bool, Never>(value: false)
797+
let publisher2 = CurrentValuePublisher<Bool, Never>(value: true)
798+
799+
publisher1.or(publisher2)
800+
.sink { values.append($0) }
801+
.store(in: &cancellables)
802+
803+
XCTAssertEqual(values, [true])
804+
}
805+
806+
func testBooleanOr_subjectAndConstant() {
807+
var cancellables = Set<AnyCancellable>()
808+
var values = [Bool]()
809+
810+
let subject1 = CurrentValueSubject<Bool, Never>(false)
811+
let publisher1 = CurrentValuePublisher(subject1)
812+
813+
let publisher2 = CurrentValuePublisher<Bool, Never>(value: false)
814+
815+
publisher1.or(publisher2)
816+
.sink { values.append($0) }
817+
.store(in: &cancellables)
818+
819+
XCTAssertEqual(values, [false])
820+
821+
subject1.value = true
822+
XCTAssertEqual(values, [false, true])
823+
824+
subject1.value = false
825+
XCTAssertEqual(values, [false, true, false])
826+
}
827+
828+
func testBooleanOr_subjects() {
829+
var cancellables = Set<AnyCancellable>()
830+
var values = [Bool]()
831+
832+
let subject1 = CurrentValueSubject<Bool, Never>(true)
833+
let publisher1 = CurrentValuePublisher(subject1)
834+
835+
let subject2 = CurrentValueSubject<Bool, Never>(true)
836+
let publisher2 = CurrentValuePublisher(subject2)
837+
838+
publisher1.or(publisher2)
839+
.sink { values.append($0) }
840+
.store(in: &cancellables)
841+
842+
XCTAssertEqual(values, [true])
843+
844+
subject1.value = false
845+
XCTAssertEqual(values, [true, true])
846+
847+
subject2.value = false
848+
XCTAssertEqual(values, [true, true, false])
849+
850+
subject1.value = true
851+
XCTAssertEqual(values, [true, true, false, true])
852+
}
853853

854854
// ============================================================================ //
855855
// MARK: - Deinitialization

0 commit comments

Comments
 (0)