Which deref must I use to get most of the existing interface sans `retain()`?
You can use all the slice reference methods (that do not require ownership) with:
impl<T> Deref for NonEmpty<T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
&self.v
}
}
impl<T> DerefMut for NonEmpty<T> {
fn deref_mut(&mut self) -> &mut [T] {
&mut self.v
}
}
https://doc.rust-lang.org/std/primitive.slice.htmlIf you DerefMut to a Vec then you won't be able to preserve the invariant.
If you want control over methods to expose then you need wrapper methods for those you want. If you want to expose some of the traits the inner type implements then there are likely derive macros available e.g. with derive_more you could expose just indexing as:
#[derive(Index, IndexMut)]
struct MyVec(Vec<i32>);