{"action":"created","comment":{"url":"https://api.github.com/repos/emil-e/rapidcheck/pulls/comments/37960258","id":37960258,"diff_hunk":"@@ -0,0 +1,341 @@\n+#pragma once\n+\n+#include \"rapidcheck/state/gen/Commands.h\"\n+\n+namespace rc {\n+namespace state {\n+namespace gen {\n+\n+namespace detail {\n+template <typename Cmd, typename GenFunc>\n+class ParallelCommandsGen {\n+public:\n+  using CmdSP = std::shared_ptr<const Cmd>;\n+  using Model = typename Cmd::Model;\n+  using Sut = typename Cmd::Sut;\n+\n+  template <typename ModelArg, typename GenFuncArg>\n+  ParallelCommandsGen(ModelArg &&initialState, GenFuncArg &&genFunc)\n+      : m_initialState(std::forward<ModelArg>(initialState))\n+      , m_genFunc(std::forward<GenFuncArg>(genFunc)) {}\n+\n+  Shrinkable<ParallelCommands<Cmd>> operator()(const Random &random,\n+                                               int size) const {\n+    return generateCommands(random, size);\n+  }\n+\n+private:\n+  struct CommandEntry {\n+    CommandEntry(Random &&aRandom, Shrinkable<CmdSP> &&aShrinkable)\n+        : random(std::move(aRandom))\n+        , shrinkable(std::move(aShrinkable)) {}\n+\n+    Random random;\n+    Shrinkable<CmdSP> shrinkable;\n+  };\n+\n+  struct CommandSequence {\n+    CommandSequence(const GenFunc &func, int sz)\n+        : genFunc(func)\n+        , size(sz) {}\n+\n+    Model initialState;\n+    GenFunc genFunc;\n+    int size;\n+    std::vector<CommandEntry> entries;\n+\n+\n+    void repairEntriesFrom(std::size_t start) {\n+      for (auto i = start; i < entries.size(); i++) {\n+        if (!repairEntryAt(i)) {\n+          entries.erase(begin(entries) + i--);\n+        }\n+      }\n+    }\n+\n+    bool repairEntryAt(std::size_t i) {\n+      using namespace ::rc::detail;\n+      try {\n+        auto &entry = entries[i];\n+        const auto cmd = entry.shrinkable.value();\n+      } catch (const CaseResult &result) {\n+        if (result.type != CaseResult::Type::Discard) {\n+          throw;\n+        }\n+\n+        return regenerateEntryAt(i);\n+      }\n+\n+      return true;\n+    }\n+\n+    bool regenerateEntryAt(std::size_t i) {\n+      using namespace ::rc::detail;\n+      try {\n+        auto &entry = entries[i];\n+        entry.shrinkable = genFunc()(entry.random, size);\n+        const auto cmd = entry.shrinkable.value();\n+        return true;\n+      } catch (const CaseResult &result) {\n+        if (result.type != CaseResult::Type::Discard) {\n+          throw;\n+        }\n+      } catch (const GenerationFailure &failure) {\n+        // Just return false below\n+      }\n+\n+      return false;\n+    }\n+  };\n+\n+  struct ParallelCommandSequence {\n+    ParallelCommandSequence(CommandSequence prefix,\n+                            CommandSequence left,\n+                            CommandSequence right)\n+        : prefix(prefix)\n+        , left(left)\n+        , right(right) {}\n+\n+    CommandSequence prefix;\n+    CommandSequence left;\n+    CommandSequence right;\n+  };\n+\n+  Shrinkable<ParallelCommands<Cmd>> generateCommands(const Random &random,\n+                                                     int size) const {\n+    return shrinkable::map(generateParallelSequence(random, size),\n+                           [](const ParallelCommandSequence &sequence) {\n+                             ParallelCommands<Cmd> cmds;\n+                             copyCommandEntries(sequence.prefix, cmds.prefix);\n+                             copyCommandEntries(sequence.left, cmds.left);\n+                             copyCommandEntries(sequence.right, cmds.right);\n+                             return cmds;\n+                           });\n+  }\n+\n+  template <typename T>\n+  static void copyCommandEntries(const CommandSequence &source,\n+                                 std::vector<T> &dest) {\n+    const auto &entries = source.entries;\n+    dest.reserve(entries.size());\n+    std::transform(\n+        begin(entries),\n+        end(entries),\n+        std::back_inserter(dest),\n+        [](const CommandEntry &entry) { return entry.shrinkable.value(); });\n+  }\n+\n+  Shrinkable<ParallelCommandSequence>\n+  generateParallelSequence(const Random &random, int size) const {\n+    Random r(random);\n+    std::size_t count = (r.split().next() % (size + 1)) + 1;\n+    return shrinkable::shrinkRecur(generateInitialParallel(random, size),\n+                                   &shrinkSequence);\n+  }\n+\n+  ParallelCommandSequence generateInitialParallel(const Random &random,\n+                                                  int size) const {\n+    auto r = random;\n+    int prefixSz, leftSz, rightSz;\n+    std::tie(prefixSz, leftSz, rightSz) = parallelCommandDistribution(size);\n+\n+    std::size_t prefixCount = (r.split().next() % (prefixSz + 1));\n+    std::size_t leftCount = (r.split().next() % (leftSz + 1));\n+    std::size_t rightCount = (r.split().next() % (rightSz + 1));\n+\n+    return ParallelCommandSequence(\n+        generateInitial(random, prefixSz, prefixCount),\n+        generateInitial(random, leftSz, leftCount),\n+        generateInitial(random, rightSz, rightCount));\n+  }\n+\n+  Shrinkable<CommandSequence> generateSequence(const Random &random,\n+                                               int size) const {\n+    Random r(random);\n+    std::size_t count = (r.split().next() % (size + 1)) + 1;\n+    return shrinkable::shrinkRecur(generateInitial(random, size, count),\n+                                   &shrinkSequence);\n+  }\n+\n+  CommandSequence\n+  generateInitial(const Random &random, int size, std::size_t count) const {\n+    CommandSequence sequence(m_genFunc, size);\n+    sequence.entries.reserve(count);\n+\n+    auto r = random;\n+    while (sequence.entries.size() < count) {\n+      sequence.entries.push_back(nextEntry(r.split(), size));\n+    }\n+\n+    return sequence;\n+  }\n+\n+  CommandEntry nextEntry(const Random &random, int size) const {\n+    using namespace ::rc::detail;\n+    auto r = random;\n+    const auto gen = m_genFunc();\n+    // TODO configurability?\n+    for (int tries = 0; tries < 100; tries++) {\n+      try {\n+        auto random = r.split();\n+        auto shrinkable = gen(random, size);\n+\n+        return CommandEntry(std::move(random), std::move(shrinkable));\n+      } catch (const CaseResult &result) {\n+        if (result.type != CaseResult::Type::Discard) {\n+          throw;\n+        }\n+        // What to do?\n+      } catch (const GenerationFailure &failure) {\n+        // What to do?\n+      }\n+    }\n+\n+    // TODO better error message\n+    throw GenerationFailure(\"Failed to generate command after 100 tries.\");\n+  }\n+\n+  static Seq<ParallelCommandSequence>\n+  shrinkSequence(const ParallelCommandSequence &s) {\n+    return seq::concat(shrinkPrefix(s),\n+                       shrinkLeft(s),\n+                       shrinkRight(s),\n+                       unparallelizeLeft(s),\n+                       unparallelizeRight(s));\n+  }\n+\n+  static Seq<ParallelCommandSequence>\n+  unparallelizeLeft(const ParallelCommandSequence &s) {\n+    auto valid = seq::filter(seq::just(s),\n+                             [](const ParallelCommandSequence &s) {\n+                               return !s.left.entries.empty();\n+                             });\n+\n+    return seq::map(std::move(valid),\n+                    [](const ParallelCommandSequence &s) {\n+                      auto prefix = s.prefix;\n+                      auto left = s.left;\n+                      auto head = left.entries.begin();\n+                      prefix.entries.push_back(*head);\n+                      left.entries.erase(head);\n+                      return ParallelCommandSequence(prefix, left, s.right);\n+                    });\n+  }\n+\n+  static Seq<ParallelCommandSequence>\n+  unparallelizeRight(const ParallelCommandSequence &s) {\n+    auto valid = seq::filter(seq::just(s),\n+                             [](const ParallelCommandSequence &s) {\n+                               return !s.right.entries.empty();\n+                             });\n+\n+    return seq::map(std::move(valid),\n+                    [](const ParallelCommandSequence &s) {\n+                      auto prefix = s.prefix;\n+                      auto right = s.right;\n+                      auto head = right.entries.begin();\n+                      prefix.entries.push_back(*head);\n+                      right.entries.erase(head);\n+                      return ParallelCommandSequence(prefix, s.left, right);\n+                    });\n+  }\n+\n+  static Seq<ParallelCommandSequence>\n+  shrinkPrefix(const ParallelCommandSequence &s) {\n+    auto shrunkSeqs =\n+        seq::concat(shrinkRemoving(s.prefix), shrinkIndividual(s.prefix));\n+    return seq::map(std::move(shrunkSeqs),\n+                    [=](const CommandSequence &commands) {\n+                      return ParallelCommandSequence(commands, s.left, s.right);\n+                    });\n+  }\n+\n+  static Seq<ParallelCommandSequence>\n+  shrinkLeft(const ParallelCommandSequence &s) {\n+    auto shrunkSeqs =\n+        seq::concat(shrinkRemoving(s.left), shrinkIndividual(s.left));\n+    return seq::map(std::move(shrunkSeqs),\n+                    [=](const CommandSequence &commands) {\n+                      return ParallelCommandSequence(\n+                          s.prefix, commands, s.right);\n+                    });\n+  }\n+\n+  static Seq<ParallelCommandSequence>\n+  shrinkRight(const ParallelCommandSequence &s) {\n+    auto shrunkSeqs =\n+        seq::concat(shrinkRemoving(s.right), shrinkIndividual(s.right));\n+    return seq::map(std::move(shrunkSeqs),\n+                    [=](const CommandSequence &commands) {\n+                      return ParallelCommandSequence(\n+                          s.prefix, s.left, commands);\n+                    });\n+  }\n+\n+  static Seq<CommandSequence> shrinkRemoving(const CommandSequence &s) {\n+    auto nonEmptyRanges = seq::subranges(0, s.entries.size());\n+    return seq::map(std::move(nonEmptyRanges),\n+                    [=](const std::pair<std::size_t, std::size_t> &r) {\n+                      auto shrunk = s;\n+                      shrunk.entries.erase(begin(shrunk.entries) + r.first,\n+                                           begin(shrunk.entries) + r.second);\n+                      shrunk.repairEntriesFrom(r.first);\n+                      return shrunk;\n+                    });\n+  }\n+\n+  static Seq<CommandSequence> shrinkIndividual(const CommandSequence &s) {\n+    return seq::mapcat(seq::range<std::size_t>(0, s.entries.size()),\n+                       [=](std::size_t i) {\n+                         return seq::map(s.entries[i].shrinkable.shrinks(),\n+                                         [=](Shrinkable<CmdSP> &&cmd) {\n+                                           auto shrunk = s;\n+                                           auto &entry = shrunk.entries[i];\n+\n+                                           entry.shrinkable = std::move(cmd);\n+                                           shrunk.repairEntriesFrom(i);\n+\n+                                           return shrunk;\n+                                         });\n+                       });\n+  }\n+\n+  /// Calculates how many commands to generate for each subsequence.","path":"include/rapidcheck/state/gen/ParallelCommands.hpp","position":303,"original_position":303,"commit_id":"240f619d7b0673917787875c0d178987cf7721ea","original_commit_id":"240f619d7b0673917787875c0d178987cf7721ea","user":{"login":"emil-e","id":5737870,"avatar_url":"https://avatars.githubusercontent.com/u/5737870?v=3","gravatar_id":"","url":"https://api.github.com/users/emil-e","html_url":"https://github.com/emil-e","followers_url":"https://api.github.com/users/emil-e/followers","following_url":"https://api.github.com/users/emil-e/following{/other_user}","gists_url":"https://api.github.com/users/emil-e/gists{/gist_id}","starred_url":"https://api.github.com/users/emil-e/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emil-e/subscriptions","organizations_url":"https://api.github.com/users/emil-e/orgs","repos_url":"https://api.github.com/users/emil-e/repos","events_url":"https://api.github.com/users/emil-e/events{/privacy}","received_events_url":"https://api.github.com/users/emil-e/received_events","type":"User","site_admin":false},"body":"\"how many\" -> \"the maximum number of\"","created_at":"2015-08-26T09:03:31Z","updated_at":"2015-08-26T09:03:31Z","html_url":"https://github.com/emil-e/rapidcheck/pull/62#discussion_r37960258","pull_request_url":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62","_links":{"self":{"href":"https://api.github.com/repos/emil-e/rapidcheck/pulls/comments/37960258"},"html":{"href":"https://github.com/emil-e/rapidcheck/pull/62#discussion_r37960258"},"pull_request":{"href":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62"}}},"pull_request":{"url":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62","id":43251545,"html_url":"https://github.com/emil-e/rapidcheck/pull/62","diff_url":"https://github.com/emil-e/rapidcheck/pull/62.diff","patch_url":"https://github.com/emil-e/rapidcheck/pull/62.patch","issue_url":"https://api.github.com/repos/emil-e/rapidcheck/issues/62","number":62,"state":"open","locked":false,"title":"Parallel testing","user":{"login":"emil-e","id":5737870,"avatar_url":"https://avatars.githubusercontent.com/u/5737870?v=3","gravatar_id":"","url":"https://api.github.com/users/emil-e","html_url":"https://github.com/emil-e","followers_url":"https://api.github.com/users/emil-e/followers","following_url":"https://api.github.com/users/emil-e/following{/other_user}","gists_url":"https://api.github.com/users/emil-e/gists{/gist_id}","starred_url":"https://api.github.com/users/emil-e/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emil-e/subscriptions","organizations_url":"https://api.github.com/users/emil-e/orgs","repos_url":"https://api.github.com/users/emil-e/repos","events_url":"https://api.github.com/users/emil-e/events{/privacy}","received_events_url":"https://api.github.com/users/emil-e/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-08-25T05:43:39Z","updated_at":"2015-08-26T09:03:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"90b5afa9b77adcdf4cdcfe9fbe5e9cb99b1518e9","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62/commits","review_comments_url":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62/comments","review_comment_url":"https://api.github.com/repos/emil-e/rapidcheck/pulls/comments{/number}","comments_url":"https://api.github.com/repos/emil-e/rapidcheck/issues/62/comments","statuses_url":"https://api.github.com/repos/emil-e/rapidcheck/statuses/240f619d7b0673917787875c0d178987cf7721ea","head":{"label":"furuholm:parallel_testing","ref":"parallel_testing","sha":"240f619d7b0673917787875c0d178987cf7721ea","user":{"login":"furuholm","id":977970,"avatar_url":"https://avatars.githubusercontent.com/u/977970?v=3","gravatar_id":"","url":"https://api.github.com/users/furuholm","html_url":"https://github.com/furuholm","followers_url":"https://api.github.com/users/furuholm/followers","following_url":"https://api.github.com/users/furuholm/following{/other_user}","gists_url":"https://api.github.com/users/furuholm/gists{/gist_id}","starred_url":"https://api.github.com/users/furuholm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/furuholm/subscriptions","organizations_url":"https://api.github.com/users/furuholm/orgs","repos_url":"https://api.github.com/users/furuholm/repos","events_url":"https://api.github.com/users/furuholm/events{/privacy}","received_events_url":"https://api.github.com/users/furuholm/received_events","type":"User","site_admin":false},"repo":{"id":32100169,"name":"rapidcheck","full_name":"furuholm/rapidcheck","owner":{"login":"furuholm","id":977970,"avatar_url":"https://avatars.githubusercontent.com/u/977970?v=3","gravatar_id":"","url":"https://api.github.com/users/furuholm","html_url":"https://github.com/furuholm","followers_url":"https://api.github.com/users/furuholm/followers","following_url":"https://api.github.com/users/furuholm/following{/other_user}","gists_url":"https://api.github.com/users/furuholm/gists{/gist_id}","starred_url":"https://api.github.com/users/furuholm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/furuholm/subscriptions","organizations_url":"https://api.github.com/users/furuholm/orgs","repos_url":"https://api.github.com/users/furuholm/repos","events_url":"https://api.github.com/users/furuholm/events{/privacy}","received_events_url":"https://api.github.com/users/furuholm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/furuholm/rapidcheck","description":"QuickCheck clone for C++ with the goal of being simple to use with as little boilerplate as possible.","fork":true,"url":"https://api.github.com/repos/furuholm/rapidcheck","forks_url":"https://api.github.com/repos/furuholm/rapidcheck/forks","keys_url":"https://api.github.com/repos/furuholm/rapidcheck/keys{/key_id}","collaborators_url":"https://api.github.com/repos/furuholm/rapidcheck/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/furuholm/rapidcheck/teams","hooks_url":"https://api.github.com/repos/furuholm/rapidcheck/hooks","issue_events_url":"https://api.github.com/repos/furuholm/rapidcheck/issues/events{/number}","events_url":"https://api.github.com/repos/furuholm/rapidcheck/events","assignees_url":"https://api.github.com/repos/furuholm/rapidcheck/assignees{/user}","branches_url":"https://api.github.com/repos/furuholm/rapidcheck/branches{/branch}","tags_url":"https://api.github.com/repos/furuholm/rapidcheck/tags","blobs_url":"https://api.github.com/repos/furuholm/rapidcheck/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/furuholm/rapidcheck/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/furuholm/rapidcheck/git/refs{/sha}","trees_url":"https://api.github.com/repos/furuholm/rapidcheck/git/trees{/sha}","statuses_url":"https://api.github.com/repos/furuholm/rapidcheck/statuses/{sha}","languages_url":"https://api.github.com/repos/furuholm/rapidcheck/languages","stargazers_url":"https://api.github.com/repos/furuholm/rapidcheck/stargazers","contributors_url":"https://api.github.com/repos/furuholm/rapidcheck/contributors","subscribers_url":"https://api.github.com/repos/furuholm/rapidcheck/subscribers","subscription_url":"https://api.github.com/repos/furuholm/rapidcheck/subscription","commits_url":"https://api.github.com/repos/furuholm/rapidcheck/commits{/sha}","git_commits_url":"https://api.github.com/repos/furuholm/rapidcheck/git/commits{/sha}","comments_url":"https://api.github.com/repos/furuholm/rapidcheck/comments{/number}","issue_comment_url":"https://api.github.com/repos/furuholm/rapidcheck/issues/comments{/number}","contents_url":"https://api.github.com/repos/furuholm/rapidcheck/contents/{+path}","compare_url":"https://api.github.com/repos/furuholm/rapidcheck/compare/{base}...{head}","merges_url":"https://api.github.com/repos/furuholm/rapidcheck/merges","archive_url":"https://api.github.com/repos/furuholm/rapidcheck/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/furuholm/rapidcheck/downloads","issues_url":"https://api.github.com/repos/furuholm/rapidcheck/issues{/number}","pulls_url":"https://api.github.com/repos/furuholm/rapidcheck/pulls{/number}","milestones_url":"https://api.github.com/repos/furuholm/rapidcheck/milestones{/number}","notifications_url":"https://api.github.com/repos/furuholm/rapidcheck/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/furuholm/rapidcheck/labels{/name}","releases_url":"https://api.github.com/repos/furuholm/rapidcheck/releases{/id}","created_at":"2015-03-12T20:19:28Z","updated_at":"2015-03-12T20:19:28Z","pushed_at":"2015-08-24T20:16:31Z","git_url":"git://github.com/furuholm/rapidcheck.git","ssh_url":"git@github.com:furuholm/rapidcheck.git","clone_url":"https://github.com/furuholm/rapidcheck.git","svn_url":"https://github.com/furuholm/rapidcheck","homepage":null,"size":1362,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"emil-e:master","ref":"master","sha":"16dd54691802efe48356d14c72944f96dcff83e6","user":{"login":"emil-e","id":5737870,"avatar_url":"https://avatars.githubusercontent.com/u/5737870?v=3","gravatar_id":"","url":"https://api.github.com/users/emil-e","html_url":"https://github.com/emil-e","followers_url":"https://api.github.com/users/emil-e/followers","following_url":"https://api.github.com/users/emil-e/following{/other_user}","gists_url":"https://api.github.com/users/emil-e/gists{/gist_id}","starred_url":"https://api.github.com/users/emil-e/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emil-e/subscriptions","organizations_url":"https://api.github.com/users/emil-e/orgs","repos_url":"https://api.github.com/users/emil-e/repos","events_url":"https://api.github.com/users/emil-e/events{/privacy}","received_events_url":"https://api.github.com/users/emil-e/received_events","type":"User","site_admin":false},"repo":{"id":19587527,"name":"rapidcheck","full_name":"emil-e/rapidcheck","owner":{"login":"emil-e","id":5737870,"avatar_url":"https://avatars.githubusercontent.com/u/5737870?v=3","gravatar_id":"","url":"https://api.github.com/users/emil-e","html_url":"https://github.com/emil-e","followers_url":"https://api.github.com/users/emil-e/followers","following_url":"https://api.github.com/users/emil-e/following{/other_user}","gists_url":"https://api.github.com/users/emil-e/gists{/gist_id}","starred_url":"https://api.github.com/users/emil-e/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emil-e/subscriptions","organizations_url":"https://api.github.com/users/emil-e/orgs","repos_url":"https://api.github.com/users/emil-e/repos","events_url":"https://api.github.com/users/emil-e/events{/privacy}","received_events_url":"https://api.github.com/users/emil-e/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/emil-e/rapidcheck","description":"QuickCheck clone for C++ with the goal of being simple to use with as little boilerplate as possible.","fork":false,"url":"https://api.github.com/repos/emil-e/rapidcheck","forks_url":"https://api.github.com/repos/emil-e/rapidcheck/forks","keys_url":"https://api.github.com/repos/emil-e/rapidcheck/keys{/key_id}","collaborators_url":"https://api.github.com/repos/emil-e/rapidcheck/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/emil-e/rapidcheck/teams","hooks_url":"https://api.github.com/repos/emil-e/rapidcheck/hooks","issue_events_url":"https://api.github.com/repos/emil-e/rapidcheck/issues/events{/number}","events_url":"https://api.github.com/repos/emil-e/rapidcheck/events","assignees_url":"https://api.github.com/repos/emil-e/rapidcheck/assignees{/user}","branches_url":"https://api.github.com/repos/emil-e/rapidcheck/branches{/branch}","tags_url":"https://api.github.com/repos/emil-e/rapidcheck/tags","blobs_url":"https://api.github.com/repos/emil-e/rapidcheck/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/emil-e/rapidcheck/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/emil-e/rapidcheck/git/refs{/sha}","trees_url":"https://api.github.com/repos/emil-e/rapidcheck/git/trees{/sha}","statuses_url":"https://api.github.com/repos/emil-e/rapidcheck/statuses/{sha}","languages_url":"https://api.github.com/repos/emil-e/rapidcheck/languages","stargazers_url":"https://api.github.com/repos/emil-e/rapidcheck/stargazers","contributors_url":"https://api.github.com/repos/emil-e/rapidcheck/contributors","subscribers_url":"https://api.github.com/repos/emil-e/rapidcheck/subscribers","subscription_url":"https://api.github.com/repos/emil-e/rapidcheck/subscription","commits_url":"https://api.github.com/repos/emil-e/rapidcheck/commits{/sha}","git_commits_url":"https://api.github.com/repos/emil-e/rapidcheck/git/commits{/sha}","comments_url":"https://api.github.com/repos/emil-e/rapidcheck/comments{/number}","issue_comment_url":"https://api.github.com/repos/emil-e/rapidcheck/issues/comments{/number}","contents_url":"https://api.github.com/repos/emil-e/rapidcheck/contents/{+path}","compare_url":"https://api.github.com/repos/emil-e/rapidcheck/compare/{base}...{head}","merges_url":"https://api.github.com/repos/emil-e/rapidcheck/merges","archive_url":"https://api.github.com/repos/emil-e/rapidcheck/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/emil-e/rapidcheck/downloads","issues_url":"https://api.github.com/repos/emil-e/rapidcheck/issues{/number}","pulls_url":"https://api.github.com/repos/emil-e/rapidcheck/pulls{/number}","milestones_url":"https://api.github.com/repos/emil-e/rapidcheck/milestones{/number}","notifications_url":"https://api.github.com/repos/emil-e/rapidcheck/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/emil-e/rapidcheck/labels{/name}","releases_url":"https://api.github.com/repos/emil-e/rapidcheck/releases{/id}","created_at":"2014-05-08T20:19:43Z","updated_at":"2015-08-25T11:57:01Z","pushed_at":"2015-08-25T05:43:39Z","git_url":"git://github.com/emil-e/rapidcheck.git","ssh_url":"git@github.com:emil-e/rapidcheck.git","clone_url":"https://github.com/emil-e/rapidcheck.git","svn_url":"https://github.com/emil-e/rapidcheck","homepage":null,"size":2270,"stargazers_count":75,"watchers_count":75,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":17,"forks":3,"open_issues":17,"watchers":75,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62"},"html":{"href":"https://github.com/emil-e/rapidcheck/pull/62"},"issue":{"href":"https://api.github.com/repos/emil-e/rapidcheck/issues/62"},"comments":{"href":"https://api.github.com/repos/emil-e/rapidcheck/issues/62/comments"},"review_comments":{"href":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62/comments"},"review_comment":{"href":"https://api.github.com/repos/emil-e/rapidcheck/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/emil-e/rapidcheck/pulls/62/commits"},"statuses":{"href":"https://api.github.com/repos/emil-e/rapidcheck/statuses/240f619d7b0673917787875c0d178987cf7721ea"}}}}