uniques

Crates.iouniques
lib.rsuniques
version0.2.1
created_at2025-09-05 18:24:42.58011+00
updated_at2025-11-13 19:55:32.309718+00
descriptionAnalyze items in a slice and calculate the unique, first, duplicate, and subsequent items and their indices
homepage
repositoryhttps://github.com/qtfkwk/uniques
max_upload_size
id1825903
size25,572
(qtfkwk)

documentation

README

Analyze items in a slice and calculate the unique, first, duplicate, and subsequent items and their indices

[Uniques] field Description Itertools method
unique Values appearing exactly once for indices none
first First occurring values for indices Itertools::unique
duplicate Duplicate values for indices Itertools::duplicates
subsequent Subsequent duplicate values for indices Itertools::duplicates
unique_idx Indices of values that appear exactly once none
first_idx Indices of first occurring values none
duplicate_idx Indices of values that are duplicated none
subsequent_idx Indices of subsequent duplicate values none

Note that Itertools methods do not include indices.

Examples

Example with no duplicate values and only unique values

use std::collections::HashMap;
use uniques::*;

let result = Uniques::new(&["a", "b", "c"]);

assert_eq!(
    result.unique_idx,
    HashMap::from([(&"a", 0), (&"b", 1), (&"c", 2)]),
);

assert_eq!(
    result.first_idx,
    HashMap::from([(&"a", 0), (&"b", 1), (&"c", 2)]),
);

assert!(result.duplicate_idx.is_empty());

assert!(result.subsequent_idx.is_empty());

assert_eq!(
    result.unique,
    HashMap::from([(0, &"a"), (1, &"b"), (2, &"c")]),
);

assert_eq!(
    result.first,
    HashMap::from([(0, &"a"), (1, &"b"), (2, &"c")]),
);

assert!(result.duplicate.is_empty());

assert!(result.subsequent.is_empty());

Example with duplicate values and unique values

use std::collections::HashMap;
use uniques::*;

let result = Uniques::new(&["a", "b", "c", "a", "b"]);

assert_eq!(
    result.unique_idx,
    HashMap::from([(&"c", 2)]),
);

assert_eq!(
    result.first_idx,
    HashMap::from([(&"a", 0), (&"b", 1), (&"c", 2)]),
);

assert_eq!(
    result.duplicate_idx,
    HashMap::from([(&"a", vec![0, 3]), (&"b", vec![1, 4])]),
);

assert_eq!(
    result.subsequent_idx,
    HashMap::from([(&"a", vec![3]), (&"b", vec![4])]),
);

assert_eq!(
    result.unique,
    HashMap::from([(2, &"c")]),
);

assert_eq!(
    result.first,
    HashMap::from([(0, &"a"), (1, &"b"), (2, &"c")]),
);

assert_eq!(
    result.duplicate,
    HashMap::from([(0, &"a"), (1, &"b"), (3, &"a"), (4, &"b")]),
);

assert_eq!(
    result.subsequent,
    HashMap::from([(3, &"a"), (4, &"b")]),
);

Example with only duplicate values and no unique values

use std::collections::HashMap;
use uniques::*;

let result = Uniques::new(&["a", "b", "c", "a", "b", "c"]);

assert!(result.unique_idx.is_empty());

assert_eq!(
    result.first_idx,
    HashMap::from([(&"a", 0), (&"b", 1), (&"c", 2)]),
);

assert_eq!(
    result.duplicate_idx,
    HashMap::from([
        (&"a", vec![0, 3]),
        (&"b", vec![1, 4]),
        (&"c", vec![2, 5]),
    ]),
);

assert_eq!(
    result.subsequent_idx,
    HashMap::from([(&"a", vec![3]), (&"b", vec![4]), (&"c", vec![5])]),
);

assert!(result.unique.is_empty());

assert_eq!(
    result.first,
    HashMap::from([(0, &"a"), (1, &"b"), (2, &"c")]),
);

assert_eq!(
    result.duplicate,
    HashMap::from([
        (0, &"a"),
        (1, &"b"),
        (2, &"c"),
        (3, &"a"),
        (4, &"b"),
        (5, &"c"),
    ]),
);

assert_eq!(
    result.subsequent,
    HashMap::from([(3, &"a"), (4, &"b"), (5, &"c")]),
);
Commit count: 2

cargo fmt