Skip to content

Commit

Permalink
Add Observer type as workaround for Swift bug SR-12294 (#46)
Browse files Browse the repository at this point in the history
* Use Xcode 12.5.1

* Add Observer type as workaround for Swift bug SR-12294
  • Loading branch information
tinder-cfuller authored Nov 19, 2021
1 parent 046c810 commit 6a493bf
Showing 1 changed file with 14 additions and 7 deletions.
21 changes: 14 additions & 7 deletions Swift/Sources/StateMachine/StateMachine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
public struct Invalid: Error, Equatable {}
}

private struct Observer {

weak var object: AnyObject?

let callback: Transition.Callback
}

public typealias Definition = StateMachineTypes.Definition<State, Event, SideEffect>

private typealias DefinitionBuilder = StateMachineTypes.DefinitionBuilder
Expand All @@ -42,7 +49,7 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
public private(set) var state: State

private let states: States
private var observers: [(object: () -> AnyObject?, callback: Transition.Callback)] = []
private var observers: [Observer] = []

public init(@DefinitionBuilder build: () -> Definition) {
let definition: Definition = build()
Expand All @@ -52,16 +59,16 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
$0[$1.event] = $1.action
}
}
observers = definition.callbacks.map { [unowned self] in
(object: { self }, callback: $0)
observers = definition.callbacks.map {
Observer(object: self, callback: $0)
}
}

@discardableResult
public func startObserving(_ observer: AnyObject?, callback: @escaping Transition.Callback) -> Self {
guard let observer: AnyObject = observer
else { return self }
observers.append((object: { [weak observer] in observer }, callback: callback))
observers.append(Observer(object: observer, callback: callback))
return self
}

Expand All @@ -71,7 +78,7 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable

public func stopObserving(_ observers: [AnyObject?]) {
self.observers.removeAll {
guard let object: AnyObject = $0.object()
guard let object: AnyObject = $0.object
else { return true }
return observers.contains { $0 === object }
}
Expand Down Expand Up @@ -104,9 +111,9 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
}

private func notify(_ result: Transition.Result) {
var observers: [(object: () -> AnyObject?, callback: Transition.Callback)] = []
var observers: [Observer] = []
for observer in self.observers {
guard observer.object() != nil
guard observer.object != nil
else { continue }
observers.append(observer)
observer.callback(result)
Expand Down

0 comments on commit 6a493bf

Please sign in to comment.