TestsTested | ✓ |
LangLanguage | SwiftSwift |
License | MIT |
ReleasedLast Release | Jan 2017 |
SwiftSwift Version | 3.0 |
SPMSupports SPM | ✓ |
Maintained by JP Wright.
The simplest Observable<T>
implementation for Functional Reactive Programming you will ever find.
This library does not use the term FRP (Functional Reactive Programming) in the way it was defined by Conal Elliot, but as a paradigm that is both functional and reactive. Read more about the difference at Why I cannot say FRP but I just did.
swift build
Result<T>
)For a full guide on how this implementation works see the series of blog posts about Functional Reactive Programming in Swift or the talk at UIKonf 2015 How to use Functional Reactive Programming without Black Magic.
let text = Observable<String>()
text.subscribe { string in
print("Hello \(string)")
}
text.update("World")
let text = Observable<String>()
let greeting = text.map { subject in
return "Hello \(subject)"
}
greeting.subscribe { text in
print(text)
}
text.update("World")
let text = Observable<String>()
let greet: (String)->String = { subject in
return "Hello \(subject)"
}
text
.map(greet)
.subscribe { text in
print(text)
}
text.update("World")
let text = Observable<String>()
func greetMaybe(subject: String) throws -> String {
if subject.characters.count % 2 == 0 {
return "Hello \(subject)"
} else {
throw NSError(domain: "Don't feel like greeting you.", code: 401, userInfo: nil)
}
}
text
.map(greetMaybe)
.then { text in
print(text)
}
.error { error in
print("There was a greeting error")
}
text.update("World")
let text = Observable<String>()
func greetMaybe(subject: String) -> Observable<Result<String>> {
if subject.characters.count % 2 == 0 {
return Observable(.success("Hello \(subject)"))
} else {
let error = NSError(domain: "Don't feel like greeting you.", code: 401, userInfo: nil)
return Observable(.error(error))
}
}
text
.flatMap(greetMaybe)
.then { text in
print(text)
}
.error { _ in
print("There was a greeting error")
}
text.update(.success("World"))
let baseCost = Observable<Int>()
let total = baseCost
.flatMap { base in
// Marks up the price
return Observable(base * 2)
}
.map { amount in
// Adds sales tax
return Double(amount) * 1.09
}
total.subscribe { total in
print("Your total is: \(total)")
}
baseCost.update(10) // prints "Your total is: 21.8"
baseCost.update(122) // prints "Your total is: 265.96"
Dynamic frameworks on iOS require a minimum deployment target of iOS 8 or later. To use Interstellar with a project targeting iOS 7, you must include all Swift files directly in your project.
Add Interstellar to your Package.swift
:
import PackageDescription
let package = Package(
name: "Your Awesome App",
targets: [],
dependencies: [
.Package(url: "https://github.com/jensravens/interstellar.git", majorVersion: 2),
]
)
Interstellar is meant to be lightweight. There are no UIKit bindings, no heavy constructs - just a simple Obersable<T>
. Therefore it’s easy to understand and portable (there is no dependency except Foundation).
Also Interstellar is supporting BYOR (bring your own Result<T>
). Due to its protocol based implementation you can use result types from other frameworks directly with Interstellar methods.
Interstellar is owned and maintained by Jens Ravens.
Optional
and Array
.Thread
was moved to a new project called WarpDrive swift build
and the new Swift package manager, including support for Linux. Also removed deprecated bind methods.Observable<T>
, the successor of Signal. Use the observable
property on signals to migrate your code from Signal<T>
. Also adding Linux support for Warpdrive and introduce BYOR™-technology (Bring Your Own Result<T>
).Interstellar is released under the MIT license. See LICENSE for details.