parametrized 0.1.1

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

// 複数のデータ構造を持つ列挙型
#[parametrized(iter, into_iter, iter_mut, map)]
enum ComplexEnum<K, V> {
    // BTreeMap を保持するバリアント
    TreeMap(BTreeMap<K, V>),
    // 配列を持つバリアント
    Array([V; 5]),
    // ベクター内の HashSet を保持するバリアント
    Sets(Vec<HashSet<V>>),
    // オプションを持つバリアント
    Optional(Option<BTreeSet<V>>),
}

fn main() {
    // TreeMap バリアントのインスタンス
    let mut tree_map_enum = ComplexEnum::TreeMap(BTreeMap::from([
        ("first", 10),
        ("second", 20),
        ("third", 30),
    ]));

    // iter() を使用して BTreeMap 内の要素を参照
    if let ComplexEnum::TreeMap(ref map) = tree_map_enum {
        for (key, value) in map.iter() {
            println!("Key: {}, Value: {}", key, value);
        }
    }

    // iter_mut() を使用して値を変更
    if let ComplexEnum::TreeMap(ref mut map) = tree_map_enum {
        for (_, value) in map.iter_mut() {
            *value *= 2; // 各値を2倍に
        }
    }

    // 変更後の TreeMap の値を表示
    if let ComplexEnum::TreeMap(ref map) = tree_map_enum {
        for (key, value) in map.iter() {
            println!("Updated Key: {}, Value: {}", key, value);
        }
    }

    // into_iter() を使用して所有権を持つイテレータを得る
    if let ComplexEnum::TreeMap(map) = tree_map_enum {
        let sum: i32 = map.into_iter().map(|(_, v)| v).sum();
        println!("Sum of all values in TreeMap: {}", sum);
    }

    // Sets バリアントの例
    let set_enum = ComplexEnum::Sets(vec![HashSet::from([1, 2, 3]), HashSet::from([4, 5, 6])]);

    // iter() で全セットを参照
    if let ComplexEnum::Sets(ref sets) = set_enum {
        for set in sets.iter() {
            println!("Set Values: {:?}", set);
        }
    }

    // Optional バリアントを生成し、map() を適用
    let optional_enum = ComplexEnum::Optional(Some(BTreeSet::from([1, 2, 3])));

    if let ComplexEnum::Optional(Some(set)) =
        optional_enum.map(|set| set.into_iter().map(|x| x + 10).collect())
    {
        println!("Updated Optional Set: {:?}", set);
    }
}