prototty_render/
col_modify.rs

1use rgb24::Rgb24;
2
3pub trait ColModify: Copy {
4    fn foreground(&self, rgb24: Option<Rgb24>) -> Option<Rgb24>;
5    fn background(&self, rgb24: Option<Rgb24>) -> Option<Rgb24>;
6
7    fn compose<Other>(self, other: Other) -> ColModifyCompose<Self, Other>
8    where
9        Other: ColModify,
10    {
11        ColModifyCompose {
12            inner: self,
13            outer: other,
14        }
15    }
16}
17
18impl<F: Fn(Option<Rgb24>) -> Option<Rgb24> + Copy> ColModify for F {
19    fn foreground(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
20        (self)(rgb24)
21    }
22    fn background(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
23        (self)(rgb24)
24    }
25}
26
27#[derive(Clone, Copy)]
28pub struct ColModifyDefaultForeground(pub Rgb24);
29impl ColModify for ColModifyDefaultForeground {
30    fn foreground(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
31        Some(rgb24.unwrap_or(self.0))
32    }
33    fn background(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
34        rgb24
35    }
36}
37
38#[derive(Clone, Copy)]
39pub struct ColModifyMap<F: Fn(Rgb24) -> Rgb24 + Copy>(pub F);
40impl<F: Fn(Rgb24) -> Rgb24 + Copy> ColModify for ColModifyMap<F> {
41    fn foreground(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
42        rgb24.map(self.0)
43    }
44    fn background(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
45        rgb24.map(self.0)
46    }
47}
48
49#[derive(Clone, Copy)]
50pub struct ColModifyIdentity;
51
52impl ColModify for ColModifyIdentity {
53    fn foreground(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
54        rgb24
55    }
56    fn background(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
57        rgb24
58    }
59}
60
61#[derive(Clone, Copy)]
62pub struct ColModifyCompose<Inner: ColModify, Outer: ColModify> {
63    pub inner: Inner,
64    pub outer: Outer,
65}
66
67impl<Inner, Outer> ColModify for ColModifyCompose<Inner, Outer>
68where
69    Inner: ColModify,
70    Outer: ColModify,
71{
72    fn foreground(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
73        self.outer.foreground(self.inner.foreground(rgb24))
74    }
75    fn background(&self, rgb24: Option<Rgb24>) -> Option<Rgb24> {
76        self.outer.background(self.inner.background(rgb24))
77    }
78}