haloumi_lowering/
lowerable.rs

1use super::{ExprLowering, Lowering, Result};
2
3pub trait LowerableExpr {
4    fn lower<L>(self, l: &L) -> Result<L::CellOutput>
5    where
6        L: ExprLowering + ?Sized;
7}
8
9impl<T> LowerableExpr for Result<T>
10where
11    T: LowerableExpr,
12{
13    fn lower<L>(self, l: &L) -> Result<L::CellOutput>
14    where
15        L: ExprLowering + ?Sized,
16    {
17        self.and_then(|t| t.lower(l))
18    }
19}
20
21impl<Lw: LowerableExpr> LowerableExpr for Box<Lw> {
22    fn lower<L>(self, l: &L) -> Result<L::CellOutput>
23    where
24        L: ExprLowering + ?Sized,
25    {
26        (*self).lower(l)
27    }
28}
29
30pub trait LowerableStmt {
31    fn lower<L>(self, l: &L) -> Result<()>
32    where
33        L: Lowering + ?Sized;
34}
35
36impl<T> LowerableStmt for Result<T>
37where
38    T: LowerableStmt,
39{
40    fn lower<L>(self, l: &L) -> Result<()>
41    where
42        L: Lowering + ?Sized,
43    {
44        self.and_then(|t| t.lower(l))
45    }
46}
47
48impl<Lw: LowerableStmt> LowerableStmt for Box<Lw> {
49    fn lower<L>(self, l: &L) -> Result<()>
50    where
51        L: Lowering + ?Sized,
52    {
53        (*self).lower(l)
54    }
55}
56
57impl<T: LowerableStmt, const N: usize> LowerableStmt for [T; N] {
58    fn lower<L>(self, l: &L) -> Result<()>
59    where
60        L: Lowering + ?Sized,
61    {
62        for e in self {
63            e.lower(l)?;
64        }
65        Ok(())
66    }
67}
68
69impl<T: LowerableStmt> LowerableStmt for Vec<T> {
70    fn lower<L>(self, l: &L) -> Result<()>
71    where
72        L: Lowering + ?Sized,
73    {
74        for e in self {
75            e.lower(l)?;
76        }
77        Ok(())
78    }
79}