{"action":"created","comment":{"url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/comments/43526726","id":43526726,"diff_hunk":"@@ -1309,98 +1252,325 @@ private struct ThrottleState<Value> {\n \tvar pendingValue: Value? = nil\n }\n \n-/// Combines the values of all the given signals, in the manner described by\n-/// `combineLatestWith`.\n+extension SignalType {\n+\t\n+\t/// observer this signal and forward any change to an Atomically wrapped CombineLatestStates object.\n+\t/// CombineLatestStates.observerForIndex will create a type safe version dependeing on the Value type of this SignalType\n+\t/// this signal will update a specific index Collector using a Type specific set operation\n+\tprivate func observeForCombineLatest<Collector:IndexedCollectorType>(values:Atomic<CombineLatestStates<Collector>>, index:Int,observer:Signal<Collector.Value, Error>.Observer) -> Disposable? {\n+\t\t\n+\t\t// let's make a SignalType specific observer that will forward to a combineLatest observer when needed\n+\t\t// this oberver will be based on Value, and the Collector's setValueAtIndex will be generated in a type safe manner\n+\t\tlet innerObserver: Observer<Value,Error> = values.value.observerForIndex(index, observer: observer)\n+\t\t\n+\t\treturn self.observe { e in\n+\t\t\tvalues.withValue { _ in  // let's observer the event with the type safe lock on.\n+\t\t\t\tinnerObserver.action(e)\n+\t\t\t}\n+\t\t}\n+\t}\n+\t\n+}\n+\n+// manage a CombineLatestStatesProtocol for Tuples, using the TupleValueType protocol\n+private final class CombineLatestStates<Collector:IndexedCollectorType>  {\n+\t\n+\ttypealias Value = Collector.Value\n+\t\n+\tvar collector: Collector\n+\t\n+\tvar completions: [Bool]\n+\tvar signalsStarted = 0\n+\t\n+\tinit(_ collector: Collector) {\n+\t\tself.collector = collector\n+\t\tself.completions = [Bool](count: self.collector.count,repeatedValue: false)\n+\t}\n+\t\n+\t// this is generic so it will become type-specific any given value T.\n+\t// it will call the type specific-generic function setValueAtIndex\n+\tfinal func onNext<T,Error>(index:Int,value:T,observer:Signal<Value, Error>.Observer) {\n+\t\t\n+\t\tlet isAStart = collector.setValueAtIndex(index,value: value)\n+\t\tif (isAStart) {\n+\t\t\tsignalsStarted++\n+\t\t}\n+\t\tif (signalsStarted == collector.count) {\n+\t\t\tobserver.sendNext(collector.toValue())\n+\t\t}\n+\t}\n+\t\n+\tfinal func onComplete<Error>(index:Int,observer:Signal<Value,Error>.Observer) {\n+\t\tcompletions[index] = true\n+\t\t\n+\t\t// we could count completions like we do starts, but it's a little safer to verify the whole list before we complete.\n+\t\tlet sendComplete = !completions.contains { !$0 }\n+\t\t\n+\t\tif (sendComplete) {\n+\t\t\tobserver.sendCompleted()\n+\t\t}\n+\t}\n+\t\n+\t// this is generic so it will become type-specific any given value T.\n+\t// it will call the type specific-generic function setValueAtIndex on the supplied collector\n+\tfinal func observerForIndex<T,Error>(index:Int,observer:Signal<Value, Error>.Observer) -> Observer<T,Error> {\n+\t\t\n+\t\treturn Observer<T,Error> { event in\n+\t\t\tswitch event {\n+\t\t\tcase let .Next(value):\n+\t\t\t\tself.onNext(index,value: value,observer: observer)\n+\t\t\t\t\n+\t\t\tcase .Completed:\n+\t\t\t\tself.onComplete(index, observer: observer)\n+\t\t\t\t\n+\t\t\tcase let .Error(err):\n+\t\t\t\tobserver.sendError(err)\n+\t\t\t\t\n+\t\t\tcase .Interrupted:\n+\t\t\t\tobserver.sendInterrupted()\n+\t\t\t}\n+\t\t}\n+\t}\n+\t\n+\t\n+}\n+\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n-public func combineLatest<A, B, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>) -> Signal<(A, B), Error> {\n-\treturn a.combineLatestWith(b)\n+public func combineLatest<A : SignalType, B : SignalType where A.Error == B.Error>(a: A, _ b: B) -> Signal<(A.Value, B.Value), A.Error> {\n+\t\n+\tlet collector = TupleCollector2<A.Value,B.Value>()\n+\tlet states = Atomic(CombineLatestStates(collector))\n+\t\n+\treturn Signal{ observer in\n+\t\tlet disposable = CompositeDisposable()\n+\t\t\n+\t\tdisposable += a.observeForCombineLatest(states, index: 0, observer: observer)\n+\t\tdisposable += b.observeForCombineLatest(states, index: 1, observer: observer)\n+\t\t\n+\t\treturn disposable\n+\t}\n }\n \n /// Combines the values of all the given signals, in the manner described by\n /// `combineLatestWith`.\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n public func combineLatest<A, B, C, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>, _ c: Signal<C, Error>) -> Signal<(A, B, C), Error> {\n-\treturn combineLatest(a, b)\n-\t\t.combineLatestWith(c)\n-\t\t.map(repack)\n+\t\n+\tlet collector = TupleCollector3<A,B,C>()\n+\tlet states = Atomic(CombineLatestStates(collector))\n+\n+\treturn Signal{ observer in\n+\t\t\n+\t\tlet disposable = CompositeDisposable()\n+\t\n+\t\tdisposable += a.observeForCombineLatest(states, index: 0, observer: observer)\n+\t\tdisposable += b.observeForCombineLatest(states, index: 1, observer: observer)\n+\t\tdisposable += c.observeForCombineLatest(states, index: 2, observer: observer)\n+\t\t\n+\t\treturn disposable\n+\t}\n }\n \n /// Combines the values of all the given signals, in the manner described by\n /// `combineLatestWith`.\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n public func combineLatest<A, B, C, D, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>, _ c: Signal<C, Error>, _ d: Signal<D, Error>) -> Signal<(A, B, C, D), Error> {\n-\treturn combineLatest(a, b, c)\n-\t\t.combineLatestWith(d)\n-\t\t.map(repack)\n+\t\n+\tlet collector = TupleCollector4<A,B,C,D>()\n+\tlet states = Atomic(CombineLatestStates(collector))\n+\n+\treturn Signal{ observer in\n+\t\t\n+\t\tlet disposable = CompositeDisposable()\n+\t\t\n+\t\tdisposable += a.observeForCombineLatest(states, index: 0, observer: observer)\n+\t\tdisposable += b.observeForCombineLatest(states, index: 1, observer: observer)\n+\t\tdisposable += c.observeForCombineLatest(states, index: 2, observer: observer)\n+\t\tdisposable += d.observeForCombineLatest(states, index: 3, observer: observer)\n+\t\t\n+\t\treturn disposable\n+\t}\n }\n \n /// Combines the values of all the given signals, in the manner described by\n /// `combineLatestWith`.\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n public func combineLatest<A, B, C, D, E, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>, _ c: Signal<C, Error>, _ d: Signal<D, Error>, _ e: Signal<E, Error>) -> Signal<(A, B, C, D, E), Error> {\n-\treturn combineLatest(a, b, c, d)\n-\t\t.combineLatestWith(e)\n-\t\t.map(repack)\n+\t\n+\tlet collector = TupleCollector5<A,B,C,D,E>()\n+\tlet states = Atomic(CombineLatestStates(collector))\n+\n+\treturn Signal{ observer in\n+\t\t\n+\t\tlet disposable = CompositeDisposable()\n+\t\t\n+\t\tdisposable += a.observeForCombineLatest(states, index: 0, observer: observer)\n+\t\tdisposable += b.observeForCombineLatest(states, index: 1, observer: observer)\n+\t\tdisposable += c.observeForCombineLatest(states, index: 2, observer: observer)\n+\t\tdisposable += d.observeForCombineLatest(states, index: 3, observer: observer)\n+\t\tdisposable += e.observeForCombineLatest(states, index: 4, observer: observer)\n+\t\t\n+\t\treturn disposable\n+\t}\n }\n \n /// Combines the values of all the given signals, in the manner described by\n /// `combineLatestWith`.\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n public func combineLatest<A, B, C, D, E, F, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>, _ c: Signal<C, Error>, _ d: Signal<D, Error>, _ e: Signal<E, Error>, _ f: Signal<F, Error>) -> Signal<(A, B, C, D, E, F), Error> {\n-\treturn combineLatest(a, b, c, d, e)\n-\t\t.combineLatestWith(f)\n-\t\t.map(repack)\n+\t\n+\tlet collector = TupleCollector6<A,B,C,D,E,F>()\n+\tlet states = Atomic(CombineLatestStates(collector))\n+\t\n+\treturn Signal{ observer in\n+\t\t\n+\t\tlet disposable = CompositeDisposable()\n+\t\t\n+\t\tdisposable += a.observeForCombineLatest(states, index: 0, observer: observer)\n+\t\tdisposable += b.observeForCombineLatest(states, index: 1, observer: observer)\n+\t\tdisposable += c.observeForCombineLatest(states, index: 2, observer: observer)\n+\t\tdisposable += d.observeForCombineLatest(states, index: 3, observer: observer)\n+\t\tdisposable += e.observeForCombineLatest(states, index: 4, observer: observer)\n+\t\tdisposable += f.observeForCombineLatest(states, index: 5, observer: observer)\n+\t\t\n+\t\treturn disposable\n+\t}\n }\n \n /// Combines the values of all the given signals, in the manner described by\n /// `combineLatestWith`.\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n public func combineLatest<A, B, C, D, E, F, G, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>, _ c: Signal<C, Error>, _ d: Signal<D, Error>, _ e: Signal<E, Error>, _ f: Signal<F, Error>, _ g: Signal<G, Error>) -> Signal<(A, B, C, D, E, F, G), Error> {\n-\treturn combineLatest(a, b, c, d, e, f)\n-\t\t.combineLatestWith(g)\n-\t\t.map(repack)\n+\t\n+\tlet collector = TupleCollector7<A,B,C,D,E,F,G>()\n+\tlet states = Atomic(CombineLatestStates(collector))\n+\t\n+\treturn Signal{ observer in\n+\t\t\n+\t\tlet disposable = CompositeDisposable()\n+\t\t\n+\t\tdisposable += a.observeForCombineLatest(states, index: 0, observer: observer)\n+\t\tdisposable += b.observeForCombineLatest(states, index: 1, observer: observer)\n+\t\tdisposable += c.observeForCombineLatest(states, index: 2, observer: observer)\n+\t\tdisposable += d.observeForCombineLatest(states, index: 3, observer: observer)\n+\t\tdisposable += e.observeForCombineLatest(states, index: 4, observer: observer)\n+\t\tdisposable += f.observeForCombineLatest(states, index: 5, observer: observer)\n+\t\tdisposable += g.observeForCombineLatest(states, index: 6, observer: observer)\n+\n+\t\treturn disposable\n+\t}\n }\n \n /// Combines the values of all the given signals, in the manner described by\n /// `combineLatestWith`.\n @warn_unused_result(message=\"Did you forget to call `observe` on the signal?\")\n public func combineLatest<A, B, C, D, E, F, G, H, Error>(a: Signal<A, Error>, _ b: Signal<B, Error>, _ c: Signal<C, Error>, _ d: Signal<D, Error>, _ e: Signal<E, Error>, _ f: Signal<F, Error>, _ g: Signal<G, Error>, _ h: Signal<H, Error>) -> Signal<(A, B, C, D, E, F, G, H), Error> {\n-\treturn combineLatest(a, b, c, d, e, f, g)","path":"ReactiveCocoa/Swift/Signal.swift","position":310,"original_position":310,"commit_id":"95bcfd3e7c8d78a3b0dc2769ec28d96b199f5bf1","original_commit_id":"95bcfd3e7c8d78a3b0dc2769ec28d96b199f5bf1","user":{"login":"NachoSoto","id":685609,"avatar_url":"https://avatars.githubusercontent.com/u/685609?v=3","gravatar_id":"","url":"https://api.github.com/users/NachoSoto","html_url":"https://github.com/NachoSoto","followers_url":"https://api.github.com/users/NachoSoto/followers","following_url":"https://api.github.com/users/NachoSoto/following{/other_user}","gists_url":"https://api.github.com/users/NachoSoto/gists{/gist_id}","starred_url":"https://api.github.com/users/NachoSoto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NachoSoto/subscriptions","organizations_url":"https://api.github.com/users/NachoSoto/orgs","repos_url":"https://api.github.com/users/NachoSoto/repos","events_url":"https://api.github.com/users/NachoSoto/events{/privacy}","received_events_url":"https://api.github.com/users/NachoSoto/received_events","type":"User","site_admin":false},"body":"This is A LOT of repeated code. We wouldn't want to maintain so much duplication.","created_at":"2015-10-30T17:05:29Z","updated_at":"2015-10-30T17:05:29Z","html_url":"https://github.com/ReactiveCocoa/ReactiveCocoa/pull/2521#discussion_r43526726","pull_request_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521","_links":{"self":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/comments/43526726"},"html":{"href":"https://github.com/ReactiveCocoa/ReactiveCocoa/pull/2521#discussion_r43526726"},"pull_request":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521"}}},"pull_request":{"url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521","id":49083935,"html_url":"https://github.com/ReactiveCocoa/ReactiveCocoa/pull/2521","diff_url":"https://github.com/ReactiveCocoa/ReactiveCocoa/pull/2521.diff","patch_url":"https://github.com/ReactiveCocoa/ReactiveCocoa/pull/2521.patch","issue_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues/2521","number":2521,"state":"open","locked":false,"title":"refactored and re-implemented combineLatest() to use a single OSSpinLock regardless of tuple size","user":{"login":"mishagray","id":303665,"avatar_url":"https://avatars.githubusercontent.com/u/303665?v=3","gravatar_id":"","url":"https://api.github.com/users/mishagray","html_url":"https://github.com/mishagray","followers_url":"https://api.github.com/users/mishagray/followers","following_url":"https://api.github.com/users/mishagray/following{/other_user}","gists_url":"https://api.github.com/users/mishagray/gists{/gist_id}","starred_url":"https://api.github.com/users/mishagray/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mishagray/subscriptions","organizations_url":"https://api.github.com/users/mishagray/orgs","repos_url":"https://api.github.com/users/mishagray/repos","events_url":"https://api.github.com/users/mishagray/events{/privacy}","received_events_url":"https://api.github.com/users/mishagray/received_events","type":"User","site_admin":false},"body":"Added simple Tuple extensions for packing and unpacking Tuples into Arrays.\r\n    \r\ncompletely reimplemented  the combineLatest(signals : [Signal<Value,Error]) -> Signal<[Value],Error> to use a single array of values, and and a single spin lock, regardless of the number of elements in the array.   \r\n    \r\nNo more 'climbing' chain of   .combineLatest().combineLatestWith().map(repack) for each additional tuple size.\r\n\r\nOld Solution had  O(N) NSLocks, and copies of the 'latestValue' (where N = tuple or array size).\r\n\r\nNew solution uses a single array of latest Values, a single spin lock, a won't create a set of blocks that could overflow the stack.  O(1) stack depth!\r\n","created_at":"2015-10-29T00:04:32Z","updated_at":"2015-10-30T17:05:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"855d80ae223b2c83f200d551dcdd638cffecd73d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521/commits","review_comments_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521/comments","review_comment_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues/2521/comments","statuses_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/statuses/95bcfd3e7c8d78a3b0dc2769ec28d96b199f5bf1","head":{"label":"mishagray:new_combine_latest","ref":"new_combine_latest","sha":"95bcfd3e7c8d78a3b0dc2769ec28d96b199f5bf1","user":{"login":"mishagray","id":303665,"avatar_url":"https://avatars.githubusercontent.com/u/303665?v=3","gravatar_id":"","url":"https://api.github.com/users/mishagray","html_url":"https://github.com/mishagray","followers_url":"https://api.github.com/users/mishagray/followers","following_url":"https://api.github.com/users/mishagray/following{/other_user}","gists_url":"https://api.github.com/users/mishagray/gists{/gist_id}","starred_url":"https://api.github.com/users/mishagray/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mishagray/subscriptions","organizations_url":"https://api.github.com/users/mishagray/orgs","repos_url":"https://api.github.com/users/mishagray/repos","events_url":"https://api.github.com/users/mishagray/events{/privacy}","received_events_url":"https://api.github.com/users/mishagray/received_events","type":"User","site_admin":false},"repo":{"id":41333357,"name":"ReactiveCocoa","full_name":"mishagray/ReactiveCocoa","owner":{"login":"mishagray","id":303665,"avatar_url":"https://avatars.githubusercontent.com/u/303665?v=3","gravatar_id":"","url":"https://api.github.com/users/mishagray","html_url":"https://github.com/mishagray","followers_url":"https://api.github.com/users/mishagray/followers","following_url":"https://api.github.com/users/mishagray/following{/other_user}","gists_url":"https://api.github.com/users/mishagray/gists{/gist_id}","starred_url":"https://api.github.com/users/mishagray/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mishagray/subscriptions","organizations_url":"https://api.github.com/users/mishagray/orgs","repos_url":"https://api.github.com/users/mishagray/repos","events_url":"https://api.github.com/users/mishagray/events{/privacy}","received_events_url":"https://api.github.com/users/mishagray/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mishagray/ReactiveCocoa","description":"Streams of values over time","fork":true,"url":"https://api.github.com/repos/mishagray/ReactiveCocoa","forks_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/forks","keys_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/teams","hooks_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/hooks","issue_events_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/issues/events{/number}","events_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/events","assignees_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/assignees{/user}","branches_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/branches{/branch}","tags_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/tags","blobs_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/git/refs{/sha}","trees_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/statuses/{sha}","languages_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/languages","stargazers_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/stargazers","contributors_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/contributors","subscribers_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/subscribers","subscription_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/subscription","commits_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/commits{/sha}","git_commits_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/git/commits{/sha}","comments_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/comments{/number}","issue_comment_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/issues/comments{/number}","contents_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/contents/{+path}","compare_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/merges","archive_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/downloads","issues_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/issues{/number}","pulls_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/pulls{/number}","milestones_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/milestones{/number}","notifications_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/labels{/name}","releases_url":"https://api.github.com/repos/mishagray/ReactiveCocoa/releases{/id}","created_at":"2015-08-25T00:11:02Z","updated_at":"2015-08-25T00:11:05Z","pushed_at":"2015-10-30T01:26:19Z","git_url":"git://github.com/mishagray/ReactiveCocoa.git","ssh_url":"git@github.com:mishagray/ReactiveCocoa.git","clone_url":"https://github.com/mishagray/ReactiveCocoa.git","svn_url":"https://github.com/mishagray/ReactiveCocoa","homepage":"","size":14438,"stargazers_count":0,"watchers_count":0,"language":"Objective-C","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ReactiveCocoa:swift2","ref":"swift2","sha":"9af5f32b4f9f908ae5f26904fbaf49d0a9039e24","user":{"login":"ReactiveCocoa","id":3422977,"avatar_url":"https://avatars.githubusercontent.com/u/3422977?v=3","gravatar_id":"","url":"https://api.github.com/users/ReactiveCocoa","html_url":"https://github.com/ReactiveCocoa","followers_url":"https://api.github.com/users/ReactiveCocoa/followers","following_url":"https://api.github.com/users/ReactiveCocoa/following{/other_user}","gists_url":"https://api.github.com/users/ReactiveCocoa/gists{/gist_id}","starred_url":"https://api.github.com/users/ReactiveCocoa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ReactiveCocoa/subscriptions","organizations_url":"https://api.github.com/users/ReactiveCocoa/orgs","repos_url":"https://api.github.com/users/ReactiveCocoa/repos","events_url":"https://api.github.com/users/ReactiveCocoa/events{/privacy}","received_events_url":"https://api.github.com/users/ReactiveCocoa/received_events","type":"Organization","site_admin":false},"repo":{"id":3606624,"name":"ReactiveCocoa","full_name":"ReactiveCocoa/ReactiveCocoa","owner":{"login":"ReactiveCocoa","id":3422977,"avatar_url":"https://avatars.githubusercontent.com/u/3422977?v=3","gravatar_id":"","url":"https://api.github.com/users/ReactiveCocoa","html_url":"https://github.com/ReactiveCocoa","followers_url":"https://api.github.com/users/ReactiveCocoa/followers","following_url":"https://api.github.com/users/ReactiveCocoa/following{/other_user}","gists_url":"https://api.github.com/users/ReactiveCocoa/gists{/gist_id}","starred_url":"https://api.github.com/users/ReactiveCocoa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ReactiveCocoa/subscriptions","organizations_url":"https://api.github.com/users/ReactiveCocoa/orgs","repos_url":"https://api.github.com/users/ReactiveCocoa/repos","events_url":"https://api.github.com/users/ReactiveCocoa/events{/privacy}","received_events_url":"https://api.github.com/users/ReactiveCocoa/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ReactiveCocoa/ReactiveCocoa","description":"Streams of values over time","fork":false,"url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa","forks_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/forks","keys_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/teams","hooks_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/hooks","issue_events_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues/events{/number}","events_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/events","assignees_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/assignees{/user}","branches_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/branches{/branch}","tags_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/tags","blobs_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/git/refs{/sha}","trees_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/statuses/{sha}","languages_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/languages","stargazers_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/stargazers","contributors_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/contributors","subscribers_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/subscribers","subscription_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/subscription","commits_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/commits{/sha}","git_commits_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/git/commits{/sha}","comments_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/comments{/number}","issue_comment_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues/comments{/number}","contents_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/contents/{+path}","compare_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/merges","archive_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/downloads","issues_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues{/number}","pulls_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls{/number}","milestones_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/milestones{/number}","notifications_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/labels{/name}","releases_url":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/releases{/id}","created_at":"2012-03-02T22:11:24Z","updated_at":"2015-10-30T16:40:57Z","pushed_at":"2015-10-30T15:16:44Z","git_url":"git://github.com/ReactiveCocoa/ReactiveCocoa.git","ssh_url":"git@github.com:ReactiveCocoa/ReactiveCocoa.git","clone_url":"https://github.com/ReactiveCocoa/ReactiveCocoa.git","svn_url":"https://github.com/ReactiveCocoa/ReactiveCocoa","homepage":"","size":36182,"stargazers_count":10931,"watchers_count":10931,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1894,"mirror_url":null,"open_issues_count":192,"forks":1894,"open_issues":192,"watchers":10931,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521"},"html":{"href":"https://github.com/ReactiveCocoa/ReactiveCocoa/pull/2521"},"issue":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues/2521"},"comments":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/issues/2521/comments"},"review_comments":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521/comments"},"review_comment":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/pulls/2521/commits"},"statuses":{"href":"https://api.github.com/repos/ReactiveCocoa/ReactiveCocoa/statuses/95bcfd3e7c8d78a3b0dc2769ec28d96b199f5bf1"}}}}