prototty_render/
col_modify.rs1use 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}