1use std::collections::VecDeque;
2
3use crate::effect::Effect;
4use crate::env::Environment;
5
6#[derive(Debug, Clone, Default)]
8pub struct InterpretCtx {
9 pub env: Environment,
10 pub sequence: VecDeque<Effect<()>>,
11}
12
13impl InterpretCtx {
14 pub fn new(env: Environment) -> Self {
15 Self {
16 env,
17 sequence: VecDeque::new(),
18 }
19 }
20}
21
22pub fn flatten_effects<M>(effect: Effect<M>) -> Vec<Effect<M>> {
23 match effect {
24 Effect::None => vec![],
25 Effect::Batch(items) => items.into_iter().flat_map(flatten_effects).collect(),
26 other => vec![other],
27 }
28}
29
30pub fn normalize<M>(effect: Effect<M>) -> Effect<M> {
32 effect
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 #[test]
40 fn flatten_expands_batch() {
41 let effect = Effect::<i32>::batch([
42 Effect::none(),
43 Effect::batch([Effect::none(), Effect::none()]),
44 ]);
45 assert_eq!(flatten_effects(effect).len(), 0);
46 }
47}