Wikipedia
Functional reactive programming (FRP) is a programming
paradigm for reactive programming (asynchronous dataflow
programming) using the building blocks of functional
programming (e.g. map, reduce, filter).
@EliSawic
A person
class Person {
let name: String
let phoneNumber: String
init(name: String, phoneNumber: String) {
self.name = name
self.phoneNumber = phoneNumber
}
}
class MobilePhone {
func call(person: Person) -> Bool {
// implementation
}
}
@EliSawic
Imperative
let array = [0, 1, 2, 3, 4, 5]
var evenNumbers = [Int]()
for element in array {
if element % 2 == 0 {
evenNumbers.append(element)
}
}
@EliSawic
Presentation
let (presentation, presentationObserver) = Signal<Idea, NoError>.pipe()
let content = "This presentation is a signal"
let idea = Idea(content: content, quality: .Great)
presentationObserver.send(value: idea)
@EliSawic
Observing
presentation.observeValues { idea in
remember(idea: idea)
}
presentation.observeCompleted {
print("Finally...")
}
presentationObserver.send(value: idea)
presentationObserver.sendCompleted()
@EliSawic
Only great ideas
let greatIdeas = presentation.filter { $0.quality == .Great }
greatIdeas.observeValues { (greatIdea) in
remember(idea: greatIdea)
}
presentationObserver.send(value: idea)
presentationObserver.sendCompleted()
@EliSawic
Know where you are
signal.observe(on: QueueScheduler.main).observeValues { idea in
print("Performing UI updates")
}
producer.start(on: backgroundQueue).startWithValues { values in
print("Starting task")
}
@EliSawic
Free your memory
let disposablesBag = CompositeDisposable()
disposablesBag += signal.observeValues { value in
...
}
disposablesBag += producePresentation().startWithValues { (value) in
...
}
disposablesBag.dispose()
@EliSawic
Is name valid?
let isValidName = nameSignal.map { (name) -> Bool in
return input.characters.count > 2
}
@EliSawic
Is surname valid?
let isValidSurname = nameSignal.map { (name) -> Bool in
return input.characters.count > 2
}
@EliSawic
Is mail valid?
let isValidMail = mailSignal.map { (mail) -> Bool in
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluateWithObject(mail)
}
@EliSawic