Skip to content

Commit

Permalink
Merge pull request #12 from ReactiveCocoa/sergey/feedbacks-with-events
Browse files Browse the repository at this point in the history
Propagate events with state for feedbacks
  • Loading branch information
andersio authored Jul 13, 2020
2 parents 49404fc + 2ac0b44 commit 49f8a95
Show file tree
Hide file tree
Showing 4 changed files with 352 additions and 72 deletions.
16 changes: 11 additions & 5 deletions Example/UnifiedStoreUIKitExample/UnifiedStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@ enum UnifiedStore {
)
)

private static let feedbacks: Loop<State, Event>.Feedback = Loop<State, Event>.Feedback.combine(
Loop<State, Event>.Feedback.pullback(
feedback: Movies.feedback,
private static let feedbacks: Loop<State, Event>.Feedback = Movies.feedback
.pullback(
value: \.movies,
event: Event.movies
embedEvent: Event.movies,
extractEvent: { (event) -> Movies.Event? in
switch event {
case let .movies(moviesEvent):
return moviesEvent
default:
return nil
}
}
)
)
}

extension UnifiedStore {
Expand Down
17 changes: 12 additions & 5 deletions Loop/Floodgate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ final class Floodgate<State, Event>: FeedbackEventConsumer<Event> {
}
}

let (stateDidChange, changeObserver) = Signal<State, Never>.pipe()
let (stateDidChange, changeObserver) = Signal<(State, Event?), Never>.pipe()

/// Replay the current value, and then publish the subsequent changes.
var producer: SignalProducer<State, Never> {
return feedbackProducer.map(\.0)
}

private var feedbackProducer: SignalProducer<(State, Event?), Never> {
SignalProducer { observer, lifetime in
self.withValue { initial, hasStarted -> Void in
observer.send(value: initial)
observer.send(value: (initial, nil))
lifetime += self.stateDidChange.observe(observer)
}
}
Expand All @@ -40,10 +44,13 @@ final class Floodgate<State, Event>: FeedbackEventConsumer<Event> {
dispose()
}

func bootstrap(with feedbacks: [FeedbackLoop<State, Event>.Feedback]) {
func bootstrap(with feedbacks: [Loop<State, Event>.Feedback]) {
for feedback in feedbacks {
// Pass `producer` which has replay-1 semantic.
feedbackDisposables += feedback.events(producer, self)
feedbackDisposables += feedback.events(
feedbackProducer,
self
)
}

reducerLock.perform {
Expand Down Expand Up @@ -122,6 +129,6 @@ final class Floodgate<State, Event>: FeedbackEventConsumer<Event> {

private func consume(_ event: Event) {
reducer(&state, event)
changeObserver.send(value: state)
changeObserver.send(value: (state, event))
}
}
Loading

0 comments on commit 49f8a95

Please sign in to comment.