{"action":"created","comment":{"url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/comments/85505563","pull_request_review_id":6210854,"id":85505563,"diff_hunk":"@@ -0,0 +1,219 @@\n+---\n+layout: post\n+title:  \"Reuse logic, avoid duplication, maintain performance\"\n+date:   2016-10-21 11:17:48 +0000\n+author: davidnormo\n+---\n+\n+... with transducers!\n+\n+\"What now?\" may have be your first reaction. This post looks at how we can use\n+advanced functional concepts to make your code more composable (and therefore\n+reusable!). This is not a new concept but its not familiar to a lot of developers\n+especially outside of the Clojure community, which is where they were invented.\n+\n+Transducers aren't incomprehensible but they require a bit of patience and learning.\n+\n+## TL;DR\n+\n+**Pros:** Composable transformation pipelines which are independent of their input and output sources and\n+they perform really well.\n+\n+**Cons:** Transducers can be hard to get to grips with and they aren't well known.\n+\n+\n+## What is a \"transducer\"?\n+\n+A transducer is a function, that accepts a reducing function and returns a reducing function.\n+That's it. Transducers are often wrapped with an initialising function that take\n+extra arguments to augment the behaviour of the transducer like so:\n+\n+<figure><figcaption id=\"fig1\">Fig. 1</figcaption></figure>\n+\n+```javascript\n+const map = (fn) => { // `map` returns the transducer\n+  return (rf) => { // the transducer, accepts a reducing function\n+    return (acc, x) => { // and returns a reducing function\n+      rf(acc, fn(x)); // ...that calls `fn` on every input `x`\n+    };\n+  };\n+};\n+\n+// `map` doesn't know anything about the input or output,\n+// neither does the function it accepts,\n+// it only cares about the items it's reducing over\n+// (`xf` just stands for transducer)\n+const xf = map(x => x + 1)\n+// `sum` knows what the output is: a number\n+const sum = (total, x) => total + x;\n+// ...`transduce` is passed the input: an array\n+transduce(xf, sum, 0, [1,2,3,4,5]); // 20\n+```\n+\n+Transducers were introduced in Clojure but there are ports of it to Javascript! For a more comprehensive look at transducers check out the following resources:\n+\n+- [Transducers.js: A Javascript Library for Transformation of Data](http://jlongster.com/Transducers.js--A-JavaScript-Library-for-Transformation-of-Data) <sup><a href=\"#ref8654\">[1]</a></sup>\n+- [Transducers](http://clojure.org/reference/transducers) <sup><a href=\"#ref245\">[2]</a></sup>\n+- [cognitect-labs/transducers-js](https://github.com/cognitect-labs/transducers-js) <sup><a href=\"#ref8752\">[3]</a></sup>\n+\n+## What are the pros?\n+\n+So, whats good about them? Here is the breakdown of their offering:\n+\n+1. <a href=\"#composable-transforms\">Composable transforms</a>\n+2. <a href=\"#independent-of-their-input-and-output\">Independent of their input and output</a>\n+3. <a href=\"#performant\">Performant</a>\n+\n+\n+### 1. Composable transforms\n+\n+Composition gives developers the ability to pick and choose, to build up transformations\n+from other transducers and combinations of transducers. Let's building on our earlier\n+example but say this time we only wanted to sum the first 3 elements.\n+\n+<figure><figcaption>Fig. 2</figcaption></figure>\n+\n+```javascript\n+// `comp` stands for compose, it returns a function that\n+// chains the functions together.\n+// basically it does this: `comp(a,b,c)(x) => a(b(c(x)))`.\n+// In our case it returns a transducer!\n+const xf = comp (\n+  pick(3), // `pick` returns a transducer that lets n elements pass\n+  map(x => x + 1)\n+);\n+transduce(xf, sum, 0, [1,2,3,4,5]); // 9\n+```\n+\n+Pretty neat huh? Composition is less restrictive than method chaining as traditionally\n+provided by lodash/underscore <sup><a href=\"#ref1\">[4]</a></sup>. (Note: Lodash now supports\n+functional composition via `flow`.)\n+\n+It's also a nicer abstraction than working with reducing functions directly. Although\n+there is a complexity overhead, transducers are still actually quite readable.\n+\n+And because they are all just functions with the same signature you can get clever and compose pipelines!\n+\n+<figure><figcaption>Fig. 3</figcaption></figure>\n+\n+```javascript\n+const xf1 = comp( map(...), pick(...) );\n+const xf2 = comp( keep(...), filter(...) );\n+const xf3 = comp(\n+  xf1,\n+  xf2,\n+  map(...)\n+);\n+```\n+\n+### 2. Independent of their input and output\n+\n+A transducer operates only on the elements of the collection and knows nothing of the\n+collection or of the result of the reduction. It doesn't know if you are reducing from\n+an array to a number or from a stream or object. So you can reuse transducers\n+on different data structures.\n+\n+<figure><figcaption>Fig. 4</figcaption></figure>\n+\n+```javascript\n+// `x` is a number but it doesn't know where it came from!\n+const xf = map(x => x + 1);\n+\n+// an array sum into a number\n+transduce(xf, sum, 0, [1,2,3]);\n+// an array into another array!\n+into([], xf, [1,2,3]);\n+// immuatable list to a number!!\n+transduce(xf, sum, 0, List([1,2,3]));\n+```\n+\n+That means you can write a transducer once and use it in many contexts. This is because\n+a transducer captures the essence of its step and avoids being tied to the data structure.\n+For example, `map` is concerned with taking an input and returning a transformed input.\n+\n+### 3. Performant\n+\n+Transducers are performant because they don't build intermediate data structures.\n+Let's make that statement more concrete. Consider the following, non-transducer, alternative\n+to <a href=\"#fig1\">fig. 1</a>:\n+\n+<figure><figcaption>Fig. 5</figcaption></figure>\n+\n+```javascript\n+const arr = [1,2,3,4,5];\n+\n+// our `pick` in terms of reduce\n+const tmp = arr.reduce((acc, x, i) => {\n+  if (i < 3) {\n+    acc.push(x);\n+  }\n+\n+  return acc;\n+}, []);\n+\n+// our `map` in terms of reduce\n+const result = tmp.reduce((acc, x) => {\n+  acc += x + 1;\n+  return acc;\n+}, 0 );\n+\n+result; // 9\n+```\n+\n+You'll notice that `tmp` is just the result of our `pick` reduce. This is an\n+\"intermediate aggregate\". A collection that is just temporary before being passed\n+to the next step in the pipeline. James Longster<sup><a href=\"#ref8654\">[1]</a></sup> says it nicely:\n+\n+> ...transducers create no intermediate collections. If you want to apply several transformations, usually each one is performed in order, creating a new collection each time.\n+>\n+> Transducers, however, take one item off the collection at a time and fire it through the whole transformation pipeline. So it doesn't need any intermediate collections; each value runs through the pipeline separately.\n+\n+If we break the rules of big O notation for a minute, fig. 1 is roughly O(n) and\n+fig. 5 is O(2n). Strictly speaking we drop constants and low-order terms in big O notation so they are\n+both O(n) but benchmarks point out that one is more performant than the other<sup><a href=\"#ref8234\">[5]</a></sup>.\n+\n+## What are the cons?","path":"_drafts/2016-10-24-transducers.md","position":null,"original_position":175,"commit_id":"b936653722c7623c753ebbe0348c123570c81af7","original_commit_id":"2a16b78467a03b0e71a1d89ba08df49e7550e788","user":{"login":"iplog","id":643480,"avatar_url":"https://avatars.githubusercontent.com/u/643480?v=3","gravatar_id":"","url":"https://api.github.com/users/iplog","html_url":"https://github.com/iplog","followers_url":"https://api.github.com/users/iplog/followers","following_url":"https://api.github.com/users/iplog/following{/other_user}","gists_url":"https://api.github.com/users/iplog/gists{/gist_id}","starred_url":"https://api.github.com/users/iplog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iplog/subscriptions","organizations_url":"https://api.github.com/users/iplog/orgs","repos_url":"https://api.github.com/users/iplog/repos","events_url":"https://api.github.com/users/iplog/events{/privacy}","received_events_url":"https://api.github.com/users/iplog/received_events","type":"User","site_admin":false},"body":"Would it be worth to add something about the way you can break it if you do a bad closure? ","created_at":"2016-10-28T10:16:10Z","updated_at":"2016-10-28T10:17:44Z","html_url":"https://github.com/signal-noise/signal-noise.github.io/pull/4#discussion_r85505563","pull_request_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/comments/85505563"},"html":{"href":"https://github.com/signal-noise/signal-noise.github.io/pull/4#discussion_r85505563"},"pull_request":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4","id":91208759,"html_url":"https://github.com/signal-noise/signal-noise.github.io/pull/4","diff_url":"https://github.com/signal-noise/signal-noise.github.io/pull/4.diff","patch_url":"https://github.com/signal-noise/signal-noise.github.io/pull/4.patch","issue_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/4","number":4,"state":"open","locked":false,"title":"Transducers draft post","user":{"login":"davidnormo","id":881849,"avatar_url":"https://avatars.githubusercontent.com/u/881849?v=3","gravatar_id":"","url":"https://api.github.com/users/davidnormo","html_url":"https://github.com/davidnormo","followers_url":"https://api.github.com/users/davidnormo/followers","following_url":"https://api.github.com/users/davidnormo/following{/other_user}","gists_url":"https://api.github.com/users/davidnormo/gists{/gist_id}","starred_url":"https://api.github.com/users/davidnormo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidnormo/subscriptions","organizations_url":"https://api.github.com/users/davidnormo/orgs","repos_url":"https://api.github.com/users/davidnormo/repos","events_url":"https://api.github.com/users/davidnormo/events{/privacy}","received_events_url":"https://api.github.com/users/davidnormo/received_events","type":"User","site_admin":false},"body":"Let me know if I need to spend more time clarifying/simplifying any of the points. Does it all make sense?","created_at":"2016-10-27T14:11:28Z","updated_at":"2016-10-28T10:17:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"10890f6960a149fa3ace80ec6df164abd00a2f04","assignee":{"login":"iplog","id":643480,"avatar_url":"https://avatars.githubusercontent.com/u/643480?v=3","gravatar_id":"","url":"https://api.github.com/users/iplog","html_url":"https://github.com/iplog","followers_url":"https://api.github.com/users/iplog/followers","following_url":"https://api.github.com/users/iplog/following{/other_user}","gists_url":"https://api.github.com/users/iplog/gists{/gist_id}","starred_url":"https://api.github.com/users/iplog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iplog/subscriptions","organizations_url":"https://api.github.com/users/iplog/orgs","repos_url":"https://api.github.com/users/iplog/repos","events_url":"https://api.github.com/users/iplog/events{/privacy}","received_events_url":"https://api.github.com/users/iplog/received_events","type":"User","site_admin":false},"assignees":[{"login":"iplog","id":643480,"avatar_url":"https://avatars.githubusercontent.com/u/643480?v=3","gravatar_id":"","url":"https://api.github.com/users/iplog","html_url":"https://github.com/iplog","followers_url":"https://api.github.com/users/iplog/followers","following_url":"https://api.github.com/users/iplog/following{/other_user}","gists_url":"https://api.github.com/users/iplog/gists{/gist_id}","starred_url":"https://api.github.com/users/iplog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iplog/subscriptions","organizations_url":"https://api.github.com/users/iplog/orgs","repos_url":"https://api.github.com/users/iplog/repos","events_url":"https://api.github.com/users/iplog/events{/privacy}","received_events_url":"https://api.github.com/users/iplog/received_events","type":"User","site_admin":false},{"login":"chrisbrown-io","id":1853199,"avatar_url":"https://avatars.githubusercontent.com/u/1853199?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisbrown-io","html_url":"https://github.com/chrisbrown-io","followers_url":"https://api.github.com/users/chrisbrown-io/followers","following_url":"https://api.github.com/users/chrisbrown-io/following{/other_user}","gists_url":"https://api.github.com/users/chrisbrown-io/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisbrown-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisbrown-io/subscriptions","organizations_url":"https://api.github.com/users/chrisbrown-io/orgs","repos_url":"https://api.github.com/users/chrisbrown-io/repos","events_url":"https://api.github.com/users/chrisbrown-io/events{/privacy}","received_events_url":"https://api.github.com/users/chrisbrown-io/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4/commits","review_comments_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4/comments","review_comment_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/4/comments","statuses_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/statuses/b936653722c7623c753ebbe0348c123570c81af7","head":{"label":"signal-noise:transducers","ref":"transducers","sha":"b936653722c7623c753ebbe0348c123570c81af7","user":{"login":"signal-noise","id":17909811,"avatar_url":"https://avatars.githubusercontent.com/u/17909811?v=3","gravatar_id":"","url":"https://api.github.com/users/signal-noise","html_url":"https://github.com/signal-noise","followers_url":"https://api.github.com/users/signal-noise/followers","following_url":"https://api.github.com/users/signal-noise/following{/other_user}","gists_url":"https://api.github.com/users/signal-noise/gists{/gist_id}","starred_url":"https://api.github.com/users/signal-noise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signal-noise/subscriptions","organizations_url":"https://api.github.com/users/signal-noise/orgs","repos_url":"https://api.github.com/users/signal-noise/repos","events_url":"https://api.github.com/users/signal-noise/events{/privacy}","received_events_url":"https://api.github.com/users/signal-noise/received_events","type":"Organization","site_admin":false},"repo":{"id":61563063,"name":"signal-noise.github.io","full_name":"signal-noise/signal-noise.github.io","owner":{"login":"signal-noise","id":17909811,"avatar_url":"https://avatars.githubusercontent.com/u/17909811?v=3","gravatar_id":"","url":"https://api.github.com/users/signal-noise","html_url":"https://github.com/signal-noise","followers_url":"https://api.github.com/users/signal-noise/followers","following_url":"https://api.github.com/users/signal-noise/following{/other_user}","gists_url":"https://api.github.com/users/signal-noise/gists{/gist_id}","starred_url":"https://api.github.com/users/signal-noise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signal-noise/subscriptions","organizations_url":"https://api.github.com/users/signal-noise/orgs","repos_url":"https://api.github.com/users/signal-noise/repos","events_url":"https://api.github.com/users/signal-noise/events{/privacy}","received_events_url":"https://api.github.com/users/signal-noise/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/signal-noise/signal-noise.github.io","description":null,"fork":false,"url":"https://api.github.com/repos/signal-noise/signal-noise.github.io","forks_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/forks","keys_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/teams","hooks_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/hooks","issue_events_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/events","assignees_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/tags","blobs_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/languages","stargazers_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/stargazers","contributors_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/contributors","subscribers_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/subscribers","subscription_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/subscription","commits_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/merges","archive_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/downloads","issues_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/labels{/name}","releases_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/deployments","created_at":"2016-06-20T16:29:34Z","updated_at":"2016-06-20T16:33:42Z","pushed_at":"2016-10-28T09:38:48Z","git_url":"git://github.com/signal-noise/signal-noise.github.io.git","ssh_url":"git@github.com:signal-noise/signal-noise.github.io.git","clone_url":"https://github.com/signal-noise/signal-noise.github.io.git","svn_url":"https://github.com/signal-noise/signal-noise.github.io","homepage":null,"size":1450,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"signal-noise:master","ref":"master","sha":"29c82a08b39d139643de2737e1bf483960632bc5","user":{"login":"signal-noise","id":17909811,"avatar_url":"https://avatars.githubusercontent.com/u/17909811?v=3","gravatar_id":"","url":"https://api.github.com/users/signal-noise","html_url":"https://github.com/signal-noise","followers_url":"https://api.github.com/users/signal-noise/followers","following_url":"https://api.github.com/users/signal-noise/following{/other_user}","gists_url":"https://api.github.com/users/signal-noise/gists{/gist_id}","starred_url":"https://api.github.com/users/signal-noise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signal-noise/subscriptions","organizations_url":"https://api.github.com/users/signal-noise/orgs","repos_url":"https://api.github.com/users/signal-noise/repos","events_url":"https://api.github.com/users/signal-noise/events{/privacy}","received_events_url":"https://api.github.com/users/signal-noise/received_events","type":"Organization","site_admin":false},"repo":{"id":61563063,"name":"signal-noise.github.io","full_name":"signal-noise/signal-noise.github.io","owner":{"login":"signal-noise","id":17909811,"avatar_url":"https://avatars.githubusercontent.com/u/17909811?v=3","gravatar_id":"","url":"https://api.github.com/users/signal-noise","html_url":"https://github.com/signal-noise","followers_url":"https://api.github.com/users/signal-noise/followers","following_url":"https://api.github.com/users/signal-noise/following{/other_user}","gists_url":"https://api.github.com/users/signal-noise/gists{/gist_id}","starred_url":"https://api.github.com/users/signal-noise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signal-noise/subscriptions","organizations_url":"https://api.github.com/users/signal-noise/orgs","repos_url":"https://api.github.com/users/signal-noise/repos","events_url":"https://api.github.com/users/signal-noise/events{/privacy}","received_events_url":"https://api.github.com/users/signal-noise/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/signal-noise/signal-noise.github.io","description":null,"fork":false,"url":"https://api.github.com/repos/signal-noise/signal-noise.github.io","forks_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/forks","keys_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/teams","hooks_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/hooks","issue_events_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/events","assignees_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/tags","blobs_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/languages","stargazers_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/stargazers","contributors_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/contributors","subscribers_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/subscribers","subscription_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/subscription","commits_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/merges","archive_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/downloads","issues_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/labels{/name}","releases_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/signal-noise/signal-noise.github.io/deployments","created_at":"2016-06-20T16:29:34Z","updated_at":"2016-06-20T16:33:42Z","pushed_at":"2016-10-28T09:38:48Z","git_url":"git://github.com/signal-noise/signal-noise.github.io.git","ssh_url":"git@github.com:signal-noise/signal-noise.github.io.git","clone_url":"https://github.com/signal-noise/signal-noise.github.io.git","svn_url":"https://github.com/signal-noise/signal-noise.github.io","homepage":null,"size":1450,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4"},"html":{"href":"https://github.com/signal-noise/signal-noise.github.io/pull/4"},"issue":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/4"},"comments":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/signal-noise/signal-noise.github.io/statuses/b936653722c7623c753ebbe0348c123570c81af7"}}}}
{"actor":{"display_login":"iplog"}}