{"action":"created","issue":{"url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/issues/22","repository_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift","labels_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/issues/22/labels{/name}","comments_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/issues/22/comments","events_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/issues/22/events","html_url":"https://github.com/ReactiveCocoa/ReactiveSwift/pull/22","id":177858977,"number":22,"title":"Add PropertyAction","user":{"login":"sharplet","id":147686,"avatar_url":"https://avatars.githubusercontent.com/u/147686?v=3","gravatar_id":"","url":"https://api.github.com/users/sharplet","html_url":"https://github.com/sharplet","followers_url":"https://api.github.com/users/sharplet/followers","following_url":"https://api.github.com/users/sharplet/following{/other_user}","gists_url":"https://api.github.com/users/sharplet/gists{/gist_id}","starred_url":"https://api.github.com/users/sharplet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharplet/subscriptions","organizations_url":"https://api.github.com/users/sharplet/orgs","repos_url":"https://api.github.com/users/sharplet/repos","events_url":"https://api.github.com/users/sharplet/events{/privacy}","received_events_url":"https://api.github.com/users/sharplet/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":6,"created_at":"2016-09-19T18:22:17Z","updated_at":"2016-09-21T03:30:00Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/pulls/22","html_url":"https://github.com/ReactiveCocoa/ReactiveSwift/pull/22","diff_url":"https://github.com/ReactiveCocoa/ReactiveSwift/pull/22.diff","patch_url":"https://github.com/ReactiveCocoa/ReactiveSwift/pull/22.patch"},"body":"`PropertyAction` encapsulates the pattern where an `Action` should be enabled only if its input is non-nil.\r\n\r\nThe prime example of this pattern is form validation: validate some input text, and store the validated results in a property. If the form is valid, the property will be non-nil, and it should be safe to grab the current value and submit the form.\r\n\r\nI've personally written a bunch of `Action`-based code that basically just implemented this logic in an ad-hoc fashion, so I think it would be super useful to have a convenient shorthand for it.\r\n\r\n---\r\n\r\nIdeally this could just be a convenience initialiser on `Action`:\r\n\r\n    extension Action where Input == Void {\r\n      // ...\r\n    }\r\n\r\nBut unfortunately this triggers Swift's \"same-type requirement makes generic parameter non-generic\" error."},"comment":{"url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/issues/comments/248501753","html_url":"https://github.com/ReactiveCocoa/ReactiveSwift/pull/22#issuecomment-248501753","issue_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveSwift/issues/22","id":248501753,"user":{"login":"mdiep","id":1302,"avatar_url":"https://avatars.githubusercontent.com/u/1302?v=3","gravatar_id":"","url":"https://api.github.com/users/mdiep","html_url":"https://github.com/mdiep","followers_url":"https://api.github.com/users/mdiep/followers","following_url":"https://api.github.com/users/mdiep/following{/other_user}","gists_url":"https://api.github.com/users/mdiep/gists{/gist_id}","starred_url":"https://api.github.com/users/mdiep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mdiep/subscriptions","organizations_url":"https://api.github.com/users/mdiep/orgs","repos_url":"https://api.github.com/users/mdiep/repos","events_url":"https://api.github.com/users/mdiep/events{/privacy}","received_events_url":"https://api.github.com/users/mdiep/received_events","type":"User","site_admin":false},"created_at":"2016-09-21T03:30:00Z","updated_at":"2016-09-21T03:30:00Z","body":"I'd like to play around with it to understand it better and see if I can find a way to make it work in an extension. But that may mean it takes me a little longer to get to this PR."}}
{"actor":{"display_login":"mdiep"}}