ahiru-tpm 0.5.0

Drop-in replacement for the famous Tmux Plugin Manager (TPM), written in Rust. 🦆
Documentation
use std::{collections::HashSet, hash::Hash};

pub fn dedup_by_key<T, K>(items: Vec<T>, key: impl Fn(&T) -> K) -> Vec<T>
where
    K: Eq + Hash,
{
    let mut seen = HashSet::new();
    items
        .into_iter()
        .filter(|item| seen.insert(key(item)))
        .collect()
}

pub fn ensure_unique_by_key<T, K>(items: &[T], key: impl Fn(&T) -> K) -> Result<(), &T>
where
    K: Eq + Hash,
{
    let mut seen = HashSet::new();
    for item in items {
        if !seen.insert(key(item)) {
            return Err(item);
        }
    }
    Ok(())
}

pub fn ensure_unique<T: Eq + Hash + Clone>(items: Vec<T>) -> Result<Vec<T>, T> {
    let mut seen = HashSet::new();
    let mut output = Vec::with_capacity(items.len());

    for item in items {
        if !seen.insert(item.clone()) {
            return Err(item);
        }
        output.push(item);
    }

    Ok(output)
}

pub fn parse_bool(value: &str) -> Option<bool> {
    match value {
        "true" | "yes" | "y" | "on" | "1" => Some(true),
        "false" | "no" | "n" | "off" | "0" => Some(false),
        _ => None,
    }
}