Skip to content
/ scanmut Public

O(n) multi-insert and -remove for Rust vectors

License

Notifications You must be signed in to change notification settings

mpdn/scanmut

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

scanmut

Insert or remove multiple elements from a Vec in O(n) time.

This crate provides two types for versatile and efficient Vec mutation; Inserter and Remover. These two types can be seen as more generic implementations of Vec::insert and Vec::drain, allowing you to for example efficiently insert a slice, conditionally drain elements, or access elements of a Vec while draining from it.

Inserter and Remover requires an ordering of the insert and removal indices; monotonically non-increasing for Inserter and monotonically increasing for Remover.

For convenience, there are also extension traits adding common higher level operations using the Inserter and Remover. See ScanMut, InsertSliceClone, and InsertSliceCopy.

Examples

Inserting a slice into a vec using [ScanMut::insert_all]:

use scanmut::prelude::*;

let mut v = vec!['a', 'b', 'c'];
v.insert_all(1, ['d', 'e'].iter().cloned());
assert_eq!(v, vec!['a', 'd', 'e', 'b', 'c']);

Removing multiple elements in one scan using [ScanMut::multi_remove]:

use scanmut::prelude::*;

let mut v = vec!['a', 'b', 'c'];
v.multi_remove([0, 2].iter().cloned(), drop);
assert_eq!(v, vec!['b']);

License: MIT

About

O(n) multi-insert and -remove for Rust vectors

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages