Second, what you said is true, but also not really relevant; mutability is part of the API in Rust, and so that is part of the interface.
To make it more concrete, https://doc.rust-lang.org/stable/std/iter/trait.Iterator.htm..., the protocol, takes &mut self. So it must be mutable. It's following the principle you're talking about.