This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, '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
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Repository files navigation

THIS REPO IS DEPRECATED

Miscellaneous

org.immutables.eventual

!!!THIS MODULE MOVED TO immutables/eventual

Guice add-ons to resolve future-provided dependencies.

Creates special mix-in module created from defining class with special asynchronous transformation methods annotated with @EventuallyProvides, witch is asyncronous analog to Guice's @Provides. Used to annotate asynchronous provider methods used to describe transformation of async values.

@Eventually.ProvidesCcombine(Aa, Bb) {
returnnewC(a.a(), b.b());
}

In this provider method above we created binding for ListenableFuture<C> that will be functionally equivalent to the following regular @Provides method:

@ProvidesListenableFuture<B> combine(ListenableFuture<A> a, ListenableFuture<B> b) {
returnFutures.transform(Futures.allAsList(Arrays.asList(a, b)),
(List<Object> input) -> {
Aa = (A) input.get(0);
Bb = (B) input.get(1);
returnnewB(a.a(), b.b());
});
}

Here's more involved example

@Singleton// all futures will be singletonspublicclassProviders { // no need to extend AbstractModule or implement Module@Eventually.ProvidesAcreateA() {
return ...;
}
@Eventually.ProvidesListenableFuture<B> loadB() {
// loading of B is itself asyncronous, so we return futurereturn ...;
}
@Eventually.ProvidesCcombine(Aa, Bb) {
// when A and B ready, we calculate CreturnnewC(a.value(), b.calculate());
}
// Only exposed values can be injected between modules,// All other are hidden inside private module@Exposed@Eventually.ProvidesZtransformed(Cc) {
// when C is ready, we calculate Z from itreturnc.transformed();
}
}
ModulefutureModule = EventualModules.definedBy(newProviders());
ListenableFuture<Module> completedModule =
EventualModules.completedFrom(Guice.createInjector(futureModule));
// inject Z when all futures completedZz = Guice.createInjector(completedModule.get()).getInstance(Z.class);

Having dependency on ListenableFuture<A> and ListenableFuture<B>, this module exposed combined and transformed ListenableFuture<Z> available to injector.

While super-classes could be used and will be scanned for such methods, method overriding is not handled properly so avoid overriding provider methods. Use delegation to regular methods if some functionality should be implemented or overridden.

In order to customize dispatching, injector could provided with binding to @Eventually.Async Executor. So you need to mix in

On the very abstract level this library achives transformation: P(A, B... Z) -> I(A, B... Z):

  • Define providers P(A, B... Z)
  • and use it create (definedBy) a module M(F[A], F[B]... F[Z]),
  • then use it to create (createInjector) injector I(F[A], F[B]... F[Z])
  • use injector to get future (completedFrom) module F[M(A, B... Z)]
  • when future is fulfilled, you create injector I(A, B... Z) from the dereferenced module.

Builder was introduced to somewhat simplify composition of eventual provider modules.

// Here's equivalent to the example aboveInjectorresulting = newEventualModules.Builder()
.add(newProviders())
.joinInjector();
// See other builder methods:// .skipFailed()// .asyncExecutor(Executor)// .toFuture()

The alternative to the solution would be to use plain composition of futures. But even with java 8 lambdas, it's still might be cumbersome to reason about complicated chains of transformation. Definitely, this kind of utility might be also be built specifically for Java 8 without using Guice. This is built with Guava's ListenableFuture and not with CompletableFuture, sorry.

org.immutables.sequence

FluentIterable/Stream-like operations on pairs of values, modeled as Iterable of Map.Entry<K, V>. FluentIterable ported to java 8 types as Sequence. This is so far the best way to use both Guava and Java 8: use Sequence instead of FluentIterable or Streams. This work better for us than using integration via collector (but collector Sequence.toSequence() is available).

Examples

Sequence.from(ImmutableList.of("a", "b"))
.zipIndex()
.map((i, s) -> s + i)
.toMap()
// "{0=a0, 1=b1}";
Entries.zip(ImmutableList.of("a", "b"), ImmutableList.of(1, 1))
.inverse()
.groupByKey()
.mapValues(v -> Joiner.on(':').join(v))
.first()
.get()
.getValue()
// "a:b"

About

[DEPRECATED] Miscellaneous. "eventual" moved to immutables/eventual

Resources

Stars

3 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages