Slide 29
Slide 29 text
ReactiveFeedback (anatomy)
public static func system(
initial: Value,
scheduler: Scheduler = QueueScheduler.main,
reduce: @escaping (Value, Event) -> Value,
feedbacks: [Feedback]
) -> SignalProducer {
return SignalProducer.deferred {
let (state, stateObserver) = Signal.pipe()
let events = feedbacks.map { feedback in
return feedback.events(scheduler, state)
}
return SignalProducer(Signal.merge(events))
.scan(initial, reduce)
.on(
started: { stateObserver.send(value: initial) },
value: stateObserver.send(value:)
)
.prefix(value: initial)
}
}
private static func deferred(
_ producer: @escaping () -> SignalProducer
) -> SignalProducer {
return SignalProducer { $1 += producer().start($0) }
}
Feedback loop(s)
Call reducer for
each new event
Pass in initial state