pub fn will_be_called() -> &'static str { let val = "called"; println!("{}", val); val } pub fn will_not_be_called() -> bool { println!("should not have been called"); false } pub fn print(left: &str, value: T, right: &str) where T: std::fmt::Display, { println!("{}{}{}", left, value, right); } pub fn wrap_with(inner: T, should_wrap: bool, wrapper: F) where F: FnOnce(&T) { if should_wrap { wrapper(&inner) } } fn main() { let less = 1; let more = 100; if less < more { wrap_with(will_be_called(), less < more, |inner| print(" ***", inner, "*** ")); wrap_with(will_be_called(), more < less, |inner| print(" ***", inner, "*** ")); } else { wrap_with(will_not_be_called(), true, |inner| print("wrapped result is: ", inner, "")); } }