templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248
, '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

templating - #25

Open
auriium wants to merge 1 commit into
masterfrom
modifications
Open

templating#25
auriium wants to merge 1 commit into
masterfrom
modifications

Conversation

@auriium

Copy link
Copy Markdown
Contributor

I'd like to add a feature like this

CentralisedFuture<Transaction> provideTransact();

to the code. I'm fairly sure my current implementation is wrong or bad or something bad will be found about it, but the point here is not top notch code, but to show that a feature is required since i'm not sure if i can implement it myself

This feature would be useful in the context of methods that provide completablefutures and use the completablefuture's builder style methods as you can do something like

future.thenApply(transaction -> { //do something safely with transaction }).thenCombine(// another future that starts with a thenApply)

This would make writing api-using code a lot less tedious, although i do not know of the safety of this method since someone could probably block and cache the transaction in memory causing pain and suffering, so a safer implementation of this is probably in order

@auriium

Copy link
Copy Markdown
ContributorAuthor

I mean it's kind of just for what if you want to do transactions somewhere in the middle and not at the end of a block of connected futures?

@A248

A248 commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

@auriium

Copy link
Copy Markdown
ContributorAuthor

The problem with this concept is that the DataCenter is responsible for closing the transaction when it's finished.

When a Function<Transaction, R> or Consumer is used, the DataCenter can pass the Transaction to the closure, close the transaction, and return the resulting future. This ensures a safe lifetime of the transaction, the only potential for mishap being if someone were to store the Transaction in a field or return the Transaction from the Function (as you are doing in the implementation of this PR)

Another idea would be to have the caller close the Transaction. However, that would be error-prone as the caller would need to ensure Transaction.close is called somewhere in the calling code. With chained CompletableFutures, it is easy for this to go wrong. Moreover, AutoCloseable would help little here - there is no such thing as an asynchronous version of try-with-resources.

I did note the issue of the transaction being readily available. I have a solution for that, and it is a CompletableFuture implementation that can not perform a blocking get / join, which would keep the user from storing references to the transaction. However, the issue of transactions being closable is another issue which i have to address, which i will do inside of beetle - I'm planning on reimplementing the future interface from scratch for visibility purposes and will create a ClosableFuture implementation.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@auriium@A248