Skip to content
This repository has been archived by the owner on Jan 24, 2023. It is now read-only.

Commit

Permalink
Merge pull request #158 from UrbanCompass/tim/add_variable_map
Browse files Browse the repository at this point in the history
Re-add Variable map
  • Loading branch information
tim-chamberlin authored May 17, 2021
2 parents 6684683 + f2226d1 commit cb8ba3e
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 8 deletions.
4 changes: 2 additions & 2 deletions Snail/Extensions/URLSessionExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ extension URLSession {
}

private static var disposerKey = "com.compass.Snail.URLSession.Disposer"
var disposer: Disposer {

public var disposer: Disposer {
if let disposer = objc_getAssociatedObject(self, &URLSession.disposerKey) as? Disposer {
return disposer
}
Expand Down
4 changes: 2 additions & 2 deletions Snail/Replay.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class Replay<T>: Observable<T> {

private func replay(queue: DispatchQueue?, handler: @escaping (Event<T>) -> Void) {
eventsQueue.sync {
self.events.forEach {
event in notify(subscriber: Subscriber(queue: queue, observable: self, handler: handler), event: event)
self.events.forEach { event in
notify(subscriber: Subscriber(queue: queue, observable: self, handler: handler), event: event)
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions Snail/Variable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ public class Variable<T> {
let subject: Replay<T>
var lock = NSRecursiveLock()
var currentValue: T
private let disposer = Disposer()

public var value: T {
get {
Expand Down Expand Up @@ -37,6 +38,15 @@ public class Variable<T> {
})
}

public func map<U>(_ transform: @escaping (T) -> U) -> Variable<U> {
let newVariable = Variable<U>(transform(value))
asObservable().subscribe(onNext: { [weak self] _ in
guard let self = self else { return }
newVariable.value = transform(self.value)
}).add(to: disposer)
return newVariable
}

deinit {
subject.on(.done)
}
Expand Down
19 changes: 15 additions & 4 deletions SnailTests/VariableTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class VariableTests: XCTestCase {
subject.value = "new"
var subjectCharactersCount: Int?

subject.asObservable().subscribe(onNext: { val in subjectCharactersCount = val.count }).add(to: disposer)
subject.map { $0.count }.asObservable().subscribe(onNext: { subjectCharactersCount = $0 }).add(to: disposer)

XCTAssertEqual(subject.value.count, subjectCharactersCount)
}
Expand All @@ -54,7 +54,7 @@ class VariableTests: XCTestCase {
let subject = Variable("initial")
var subjectCharactersCount: Int?

subject.asObservable().subscribe(onNext: { val in subjectCharactersCount = val.count }).add(to: disposer)
subject.map { $0.count }.asObservable().subscribe(onNext: { subjectCharactersCount = $0 }).add(to: disposer)

XCTAssertEqual(subject.value.count, subjectCharactersCount)
}
Expand All @@ -63,7 +63,7 @@ class VariableTests: XCTestCase {
let subject = Unique("sameValue")
var firedCount = 0

subject.asObservable().subscribe(onNext: { _ in
subject.map { $0.count }.asObservable().subscribe(onNext: { _ in
firedCount += 1
}).add(to: disposer)

Expand All @@ -76,7 +76,7 @@ class VariableTests: XCTestCase {
let subject = Variable("sameValue")
var firedCount = 0

subject.asObservable().subscribe(onNext: { _ in
subject.map { $0.count }.asObservable().subscribe(onNext: { _ in
firedCount += 1
}).add(to: disposer)

Expand All @@ -85,6 +85,17 @@ class VariableTests: XCTestCase {
XCTAssertEqual(firedCount, 2)
}

func testMapToVoid() {
let subject = Variable("initial")
var fired = false

subject.map { _ in return () }.asObservable().subscribe(onNext: { _ in
fired = true
}).add(to: disposer)

XCTAssertTrue(fired)
}

func testBindToOtherVariable() {
let subject = Variable("one")
let observedVariable = Variable("two")
Expand Down

0 comments on commit cb8ba3e

Please sign in to comment.