diff --git a/src/algo.rs b/src/algo.rs
index e7ea6ab32..65fdc2cad 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -118,26 +118,9 @@ fn compute_internal(
let is_column = dir.is_column();
let is_wrap_reverse = node.flex_wrap == FlexWrap::WrapReverse;
- let margin = Rect {
- start: node.margin.start.resolve(percent_calc_base).or_else(0.0),
- end: node.margin.end.resolve(percent_calc_base).or_else(0.0),
- top: node.margin.top.resolve(percent_calc_base).or_else(0.0),
- bottom: node.margin.bottom.resolve(percent_calc_base).or_else(0.0),
- };
-
- let padding = Rect {
- start: node.padding.start.resolve(percent_calc_base).or_else(0.0),
- end: node.padding.end.resolve(percent_calc_base).or_else(0.0),
- top: node.padding.top.resolve(percent_calc_base).or_else(0.0),
- bottom: node.padding.bottom.resolve(percent_calc_base).or_else(0.0),
- };
-
- let border = Rect {
- start: node.border.start.resolve(percent_calc_base).or_else(0.0),
- end: node.border.end.resolve(percent_calc_base).or_else(0.0),
- top: node.border.top.resolve(percent_calc_base).or_else(0.0),
- bottom: node.border.bottom.resolve(percent_calc_base).or_else(0.0),
- };
+ let margin = node.margin.map(&|n| n.resolve(percent_calc_base).or_else(0.0));
+ let padding = node.padding.map(&|n| n.resolve(percent_calc_base).or_else(0.0));
+ let border = node.border.map(&|n| n.resolve(percent_calc_base).or_else(0.0));
let padding_border = Rect {
start: padding.start + border.start,
@@ -179,48 +162,14 @@ fn compute_internal(
.map(|child| FlexItem {
node: child,
- size: Size {
- width: child.size.width.resolve(percent_calc_base_child),
- height: child.size.height.resolve(percent_calc_base_child),
- },
-
- min_size: Size {
- width: child.min_size.width.resolve(percent_calc_base_child),
- height: child.min_size.height.resolve(percent_calc_base_child),
- },
+ size: child.size.map(&|s| s.resolve(percent_calc_base_child)),
+ min_size: child.min_size.map(&|s| s.resolve(percent_calc_base_child)),
+ max_size: child.max_size.map(&|s| s.resolve(percent_calc_base_child)),
- max_size: Size {
- width: child.max_size.width.resolve(percent_calc_base_child),
- height: child.max_size.height.resolve(percent_calc_base_child),
- },
-
- position: Rect {
- start: child.position.start.resolve(percent_calc_base_child),
- end: child.position.end.resolve(percent_calc_base_child),
- top: child.position.top.resolve(percent_calc_base_child),
- bottom: child.position.bottom.resolve(percent_calc_base_child),
- },
-
- margin: Rect {
- start: child.margin.start.resolve(percent_calc_base_child).or_else(0.0),
- end: child.margin.end.resolve(percent_calc_base_child).or_else(0.0),
- top: child.margin.top.resolve(percent_calc_base_child).or_else(0.0),
- bottom: child.margin.bottom.resolve(percent_calc_base_child).or_else(0.0),
- },
-
- padding: Rect {
- start: child.padding.start.resolve(percent_calc_base_child).or_else(0.0),
- end: child.padding.end.resolve(percent_calc_base_child).or_else(0.0),
- top: child.padding.top.resolve(percent_calc_base_child).or_else(0.0),
- bottom: child.padding.bottom.resolve(percent_calc_base_child).or_else(0.0),
- },
-
- border: Rect {
- start: child.border.start.resolve(percent_calc_base_child).or_else(0.0),
- end: child.border.end.resolve(percent_calc_base_child).or_else(0.0),
- top: child.border.top.resolve(percent_calc_base_child).or_else(0.0),
- bottom: child.border.bottom.resolve(percent_calc_base_child).or_else(0.0),
- },
+ position: child.position.map(&|p| p.resolve(percent_calc_base_child)),
+ margin: child.margin.map(&|m| m.resolve(percent_calc_base_child).or_else(0.0)),
+ padding: child.padding.map(&|p| p.resolve(percent_calc_base_child).or_else(0.0)),
+ border: child.border.map(&|b| b.resolve(percent_calc_base_child).or_else(0.0)),
flex_basis: 0.0,
inner_flex_basis: 0.0,
diff --git a/src/geometry.rs b/src/geometry.rs
index c16ac19de..4e3ac2af5 100644
--- a/src/geometry.rs
+++ b/src/geometry.rs
@@ -10,6 +10,12 @@ pub struct Rect<T> {
pub bottom: T,
}
+impl<T> Rect<T> {
+ pub(crate) fn map<R>(self, f: &(Fn(T) -> R)) -> Rect<R> {
+ Rect { start: f(self.start), end: f(self.end), top: f(self.top), bottom: f(self.bottom) }
+ }
+}
+
impl<T> Rect<T>
where
T: Add<Output = T> + Copy + Clone,
@@ -77,6 +83,10 @@ pub struct Size<T> {
}
impl<T> Size<T> {
+ pub(crate) fn map<R>(self, f: &(Fn(T) -> R)) -> Size<R> {
+ Size { width: f(self.width), height: f(self.height) }
+ }
+
pub(crate) fn set_main(&mut self, direction: style::FlexDirection, value: T) {
match direction {
style::FlexDirection::Row | style::FlexDirection::RowReverse => self.width = value,
@@ -111,3 +121,9 @@ pub struct Point<T> {
pub x: T,
pub y: T,
}
+
+impl<T> Point<T> {
+ pub(crate) fn map<R>(self, f: &(Fn(T) -> R)) -> Point<R> {
+ Point { x: f(self.x), y: f(self.y) }
+ }
+}