haloumi_lowering/
lowerable.rs1use 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}