Skip to main content

rust_elm/core/
interp.rs

1use std::collections::VecDeque;
2
3use crate::effect::Effect;
4use crate::env::Environment;
5
6/// Context passed to the effect interpreter inside `runtime.rs`.
7#[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
30/// Identity helper kept for roadmap compatibility.
31pub 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}