1 unstable release

0.3.0 Sep 2, 2020
0.2.0 Sep 2, 2020
0.1.0 Sep 2, 2020
0.0.1 Sep 2, 2020

#223 in Parser tooling

MIT license

23KB
380 lines

oom - One Or Many slice types

Build Status Documentation Crates.io

Took inspirations from the "Parse, don’t validate" article.

This package defines three types: NonEmptySlice, NonEmptyMutSlice and NonEmptyVec. Those types don't implement Deref or DerefMut trait, it is intentional to avoid confusion when resolving methods. If you want &[T], consider using as_slice or as_mut_slice methods.

NonEmptySlice and NonEmptyMutSlice:

  • are borrow types (not owned type).
  • are counterparts of &[T] and &mut [T].
  • have same size and similar niche as &[T]
  • cannot be used without borrow contents from array, slice or Vec.

NonEmptyVec:

  • is an owned types, counterparts of Vec<T>.
  • doesn't have push and pop methods, because those are fallible operations. I had to deal with unsafe codes that I am not confident if I want to implement them.

The differences from &[T] and Vec<T>:

  • .len() returns std's NonZeroUsize.
  • .is_empty() is always false.
  • These methods don't return None:
    • first
    • first_mut
    • last
    • last_mut
    • split_first
    • split_last
    • split_first_mut
    • split_last_mut

Notable features

  • #![no_std]
  • no external dependencies
  • no macros
  • instant build time.

Supported Rust versions

Latest stable. I use the new conditional flows in const fn available only in Rust v1.46.0.

Usage

Add this to your Cargo.toml:

[dependencies]
oom = "0.3.0"

Or assuming you installed cargo-edit, use:

cargo add oom

Thanks for inspirations from

License

All the code in this repository is released under the MIT License, for more information read the COPYRIGHT file.

No runtime deps