Advertisement
Guest User

Untitled

a guest
May 29th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. // Automatically responds to changes in `value` property
  2. class Observable<Value, Return> {
  3.  
  4. // Contents of observable
  5. var value: Value
  6.  
  7. // Run whenever value changes
  8. let onChange: Value -> Return
  9.  
  10. init(withInitial value: Value, onChange change: Value -> Return) {
  11. self.value = value
  12. self.onChange = change
  13. }
  14.  
  15. // Returns current value
  16. func getValue() -> Value {
  17. return self.value;
  18. }
  19.  
  20. // Updates value
  21. func update(value: Value) {
  22. self.value = value
  23. self.onChange(self.value)
  24. }
  25.  
  26. // Applies transform to value
  27. func flatmap(transform: Value -> Value) {
  28. self.update(transform(self.value));
  29. }
  30.  
  31.  
  32. }
  33.  
  34. // Example 1: Logging integers
  35.  
  36. func logInt(i: Int) {
  37. print("logging int: ", i)
  38. }
  39.  
  40. let intObserver = Observable(withInitial: 0, onChange: logInt)
  41.  
  42. for i in 1...10 {
  43. intObserver.flatmap { i in i + 1 };
  44. }
  45.  
  46. // Example 2: Saving user automatically on update
  47.  
  48. class User {
  49. let id: Int
  50. let username: String
  51. var password: String
  52.  
  53. init(id: Int, username: String, password: String) {
  54. self.id = id
  55. self.username = username
  56. self.password = password
  57. }
  58. }
  59.  
  60. func saveUser(user: User) {
  61. print("Saving ", user.username);
  62. }
  63.  
  64. let user = User(id: 1, username: "wdavenport", password: "testing")
  65. let userObserver = Observable(withInitial: user, onChange: saveUser)
  66.  
  67. // Change password
  68. userObserver.flatmap { user in
  69. user.password = "newPassword"
  70. return user
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement