use serde::{Deserialize, Serialize};
use std::collections::BTreeSet;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum Effect {
Pure,
Io,
Net,
Mut,
Act,
}
pub type EffectSet = BTreeSet<Effect>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serializes_and_round_trips_through_json() {
let effects: EffectSet = EffectSet::from([Effect::Io, Effect::Act]);
let json = serde_json::to_string(&effects).unwrap();
let back: EffectSet = serde_json::from_str(&json).unwrap();
assert_eq!(effects, back);
}
#[test]
fn json_wire_format_is_locked() {
assert_eq!(serde_json::to_string(&Effect::Io).unwrap(), "\"Io\"");
assert_eq!(serde_json::to_string(&Effect::Act).unwrap(), "\"Act\"");
}
#[test]
fn duplicates_collapse_and_serialization_order_is_stable() {
let a: EffectSet = EffectSet::from([Effect::Act, Effect::Io, Effect::Io]);
let b: EffectSet = EffectSet::from([Effect::Io, Effect::Act]);
assert_eq!(a, b);
assert_eq!(serde_json::to_string(&a).unwrap(), serde_json::to_string(&b).unwrap());
}
}