Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Automatically responds to changes in `value` property
- class Observable<Value, Return> {
- // Contents of observable
- var value: Value
- // Run whenever value changes
- let onChange: Value -> Return
- init(withInitial value: Value, onChange change: Value -> Return) {
- self.value = value
- self.onChange = change
- }
- // Returns current value
- func getValue() -> Value {
- return self.value;
- }
- // Updates value
- func update(value: Value) {
- self.value = value
- self.onChange(self.value)
- }
- // Applies transform to value
- func flatmap(transform: Value -> Value) {
- self.update(transform(self.value));
- }
- }
- // Example 1: Logging integers
- func logInt(i: Int) {
- print("logging int: ", i)
- }
- let intObserver = Observable(withInitial: 0, onChange: logInt)
- for i in 1...10 {
- intObserver.flatmap { i in i + 1 };
- }
- // Example 2: Saving user automatically on update
- class User {
- let id: Int
- let username: String
- var password: String
- init(id: Int, username: String, password: String) {
- self.id = id
- self.username = username
- self.password = password
- }
- }
- func saveUser(user: User) {
- print("Saving ", user.username);
- }
- let user = User(id: 1, username: "wdavenport", password: "testing")
- let userObserver = Observable(withInitial: user, onChange: saveUser)
- // Change password
- userObserver.flatmap { user in
- user.password = "newPassword"
- return user
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement