Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov
, '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

Inherent rng methods - #1492

Closed
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods
Closed

Inherent rng methods#1492
dhardy wants to merge 3 commits into
rust-random:masterfrom
dhardy:inherent-rng-methods

Conversation

@dhardy

@dhardydhardy commented Sep 10, 2024

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Make Rng methods inherent methods on RNGs, and more usability tweaks.

Motivation and details

This follows arguments made in #989 and #1488. Specifically,

  • We rename Rng::gen_iter to random_iter since it is the iterable version of Rng::random
  • We implement all (non-deprecated) Rng methods on StdRng, SmallRng, ThreadRng and StepRng
  • We remove rand::random, favouring usage of rand::thread_rng().random instead. This is not necessary but is more in-line with other Rng methods. Change removed from this PR.

I did consider publicly exporting impl_rng_methods_as_inherent, but realised a problem: rand_chacha cannot use this since rand depends on rand_chacha (and the macro cannot be moved to rand_core); some other RNG crates could use this but should not depend on rand.

Incomplete / questions

Do we want to rename gen_range to just range? What about gen_bool, gen_ratio?

Do we want to remove rand::random? If not, do we want to add random_iter, gen_range etc. as free functions? (rand::random is hardly used inside rand itself. This GitHub search has 33k code hits but it's hard to tell how many are genuine matches.)

@oconnor663 gave motivation to rename thread_rng to just rng:

you [the user] have to understand what thread_rng means and that it's the right thing to use

We could do this. If this were a clean design then probably we should: it's an implementation detail that we use a thread-local generator and not, say, a mutex over a single (static) generator. But it's also rather widely used: approx 150 mentions in this repo and 176k code hits via GitHub search.

@dhardydhardy added the E-question Participation: opinions wanted label Sep 11, 2024
@dhardy
dhardy requested review from newpavlov and vksSeptember 13, 2024 07:26
@dhardy

Copy link
Copy Markdown
MemberAuthor

I was intending to leave these changes until after rand v0.9, but now think we should get these merged first: upgrading to 0.9 already brings many small breaking changes for users; rolling these into a single (larger) changeset should result in less work for those upgrading.

Some more thoughts:

  • Renaming thread_rngrng is an easy search+replace (no false positives likely). Is there a downside (e.g. the possibility of adding another RNG)? We've stuck with this rough design for several years now (but changing the algorithm, seeding, access control).
  • We have Rng::gen_range which uses Uniform... weird but okay (though we could hypothetically rename to Rng::uniform and add rand::uniform).

@dhardy
dhardyforce-pushed the inherent-rng-methods branch from 2a5de77 to 7c72ebdCompareSeptember 24, 2024 09:50
@dhardy

Copy link
Copy Markdown
MemberAuthor

This PR no longer removes the rand::random function (left to a future PR). Other changes of this PR I'd like to see merged, unless there's any issue I haven't spotted here. Ultimately I hope we can replace these inherent impls with native Rust support for inherent trait methods.

@dhardy
dhardy marked this pull request as ready for review September 24, 2024 09:54
@dhardydhardy added D-review Do: needs review and removed E-question Participation: opinions wanted labels Sep 24, 2024

@newpavlovnewpavlov left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I do not like duplication of trait methods as inherent. I think it obscures the code and make it less consistent across crates.

@dhardy

Copy link
Copy Markdown
MemberAuthor

I want to agree, especially since these inherent impls will not work for any RNG outside of rand. The objective was to ease usage (esp. for people new to Rust), but the result making this less consistent across RNGs does not help.

@dhardydhardy mentioned this pull request Sep 28, 2024
1 task
dhardy added a commit that referenced this pull request Oct 1, 2024
This extracts the non-inherent-methods stuff from #1492.
@dhardy
dhardyforce-pushed the inherent-rng-methods branch from a7ddabf to 9af9444CompareOctober 3, 2024 07:49
@dhardydhardy closed this Oct 7, 2024
@dhardy
dhardy deleted the inherent-rng-methods branch October 16, 2024 15:13
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
benjamin-lieser pushed a commit to benjamin-lieser/rand that referenced this pull request Feb 5, 2025
This extracts the non-inherent-methods stuff from rust-random#1492.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

D-reviewDo: needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@dhardy@newpavlov