Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Implement io.Reader - #52

Open
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader
Open

Implement io.Reader#52
xoen wants to merge 2 commits into
bitly:masterfrom
xoen:ag/io-reader

Conversation

@xoen

@xoenxoen commented Apr 22, 2016

Copy link
Copy Markdown

simplejson.Json implements the io.Reader interface:

typeReaderinterface {
Read(p []byte) (nint, errerror)
}
Why?

By implementing this standard interface simplejson would play nice with the standard library and all the 3rd party packages that work with an io.Reader.

For example, it would allow to POST the JSON directly rather than being forced to Encode() and use bytes.NewReader():

// Currentlyimport ("bytes")
payloadBytes, _:=payloadJson.Encode()
req, _:=http.NewRequest("POST", "http://www.example.com", bytes.NewReader(payloadBytes))
// With io.Readerreq, _:=http.NewRequest("POST", "http://www.example.com", payloadJson)
Implementation

When starting to read the Json it encodes the data and save the bytes in the Reader struct.
This struct also keeps the index of the bytes read so far.
At every read the bytes are copied to the buffer argument and the index is increased.

(See bytes.Read() implementation)

The reader is reseted when Json.data changes

I'm far from a Go expert, so happy to receive feedback.

Tests

The test builds a first *simplejson, then a second one using NewFromReader(), this test would fail if *simplejson doesn't implement io.Reader.

Also, to test that the second JSON is equivalent with the original one (so Read() returns the correct bytes) I encode and compare them.

xoen added 2 commits April 22, 2016 00:16
As the reader pointer contains the bytes for the JSON, whne it changes these
would not be valid anymore.
NOTE: If the JSON changes between 2 Read() calls the result would still be
incorrect as the 2nd read would returns bytes from the new JSON.
Not sure how this
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@xoen