parametrized 0.1.1

Supply useful iterating methods for user-defined types which are parametrized by type parameters
Documentation
use parametrized::*;
use std::collections::{BTreeSet, HashMap, HashSet};

#[parametrized(default = [0, 1], into_iter = [0, 1], iter_mut = [0], map = [0, 1])]
struct ComplexStruct<K, V> {
    // ハッシュマップ:キーとセットのマッピング
    data: HashMap<K, HashSet<V>>,
    // 木構造セットのベクター
    sorted_values: Vec<BTreeSet<V>>,
    // メタデータ配列
    metadata: [String; 3],
}

fn main() {
    // 複雑なデータ構造を持つインスタンスを生成
    let mut complex_struct = ComplexStruct {
        data: {
            let mut map = HashMap::new();
            map.insert("category1", HashSet::from([1, 2, 3]));
            map.insert("category2", HashSet::from([4, 5, 6]));
            map
        },
        sorted_values: vec![BTreeSet::from([10, 20, 30]), BTreeSet::from([40, 50, 60])],
        metadata: [
            "meta1".to_string(),
            "meta2".to_string(),
            "meta3".to_string(),
        ],
    };

    // iter() を使用して HashMap 内の要素を参照
    for (key, set) in complex_struct.iter() {
        println!("Key: {}, Values: {:?}", key, set);
    }

    // iter_mut() を使用して値を変更
    for (_, set) in complex_struct.iter_mut() {
        set.insert(100); // 各セットに 100 を追加
    }

    // 変更後のデータを表示
    for (key, set) in complex_struct.iter() {
        println!("Updated Key: {}, Values: {:?}", key, set);
    }

    // into_iter() を使用して所有権を持つイテレータを得る
    let flattened_sum: i32 = complex_struct
        .into_iter()
        .flat_map(|(_, set)| set) // 全セットをフラットにする
        .sum();
    println!("Sum of all values: {}", flattened_sum);

    // map() を使用して BTreeSet 内の値を倍にし、新しい構造体を生成
    let new_struct = ComplexStruct {
        data: {
            let mut map = HashMap::new();
            map.insert("category1", HashSet::from([10, 20]));
            map
        },
        sorted_values: vec![BTreeSet::from([1, 2, 3])],
        metadata: [
            "meta4".to_string(),
            "meta5".to_string(),
            "meta6".to_string(),
        ],
    }
    .map(|set| set.into_iter().map(|x| x * 2).collect());

    // 新しい構造体の値を表示
    for set in new_struct.iter() {
        println!("New Values: {:?}", set);
    }
}