I feel like I'll have to read up some more to have the background to fully understand the article but one thing I wanted to point out is a difference between `fn rand_int(rand: &mut Random) -> i64` and `fn rand_int(ran: Random) -> (i64, Random)`, at least in Rust. With the version that moves `Random`, the return type is bigger and may spill over from registers to the stack which may cause a significant slow down, more than the code of Vale's generation check, I suspect.<p>I've run into this with my parser combinator library, winnow [0], and am considering switching from the nicer functional model of moving to the more imperative model of `&mut` [1].<p>[0]: <a href="https://docs.rs/winnow/latest/winnow/" rel="nofollow">https://docs.rs/winnow/latest/winnow/</a><p>[1]: <a href="https://github.com/winnow-rs/winnow/issues/72">https://github.com/winnow-rs/winnow/issues/72</a>