parametrized 0.1.1

Supply useful iterating methods for user-defined types which are parametrized by type parameters
Documentation
use my_library::parametrized;

// 複数のバリアントを持つ列挙型
#[parametrized(iter, into_iter, iter_mut, map)]
enum MyEnum<K, V> {
    Pair(K, Vec<V>),
    Map(Vec<(K, V)>),
    Metadata {
        description: String,
        values: Vec<Option<V>>,
    },
}

fn main() {
    // Pair バリアントのインスタンス
    let mut pair_enum = MyEnum::Pair("key1", vec![1, 2, 3, 4]);

    // iter() を使用して値を参照
    if let MyEnum::Pair(_, ref values) = pair_enum {
        for val in values.iter() {
            println!("Value in Pair: {}", val);
        }
    }

    // iter_mut() を使用して値を変更
    if let MyEnum::Pair(_, ref mut values) = pair_enum {
        for val in values.iter_mut() {
            *val *= 2;
        }
    }

    // 変更後の値を表示
    if let MyEnum::Pair(_, ref values) = pair_enum {
        for val in values.iter() {
            println!("Updated Value in Pair: {}", val);
        }
    }

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

    // Metadata バリアントを生成し、map() を適用
    let metadata_enum = MyEnum::Metadata {
        description: "Example Metadata".to_string(),
        values: vec![Some(5), None, Some(10)],
    };

    if let MyEnum::Metadata {
        description,
        values,
    } = metadata_enum.map(|v| v.map(|x| x + 1))
    {
        println!("Description: {}", description);
        for val in values.iter() {
            println!("Updated Metadata Value: {:?}", val);
        }
    }
}