pub fn tap<T, F>(val: T, f: F) -> T
where
F: FnOnce(&T),
{
f(&val);
val
}
pub trait Tap: Sized {
fn tap<F>(self, f: F) -> Self
where
F: FnOnce(&Self);
}
impl<T> Tap for T {
fn tap<F>(self, f: F) -> Self
where
F: FnOnce(&Self),
{
f(&self);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn function_tap_works() {
let mut seen = 0;
let val = tap(10, |v| seen = *v);
assert_eq!(val, 10);
assert_eq!(seen, 10);
}
#[test]
fn method_tap_works() {
let mut seen = 0;
let val = 20.tap(|v| seen = *v);
assert_eq!(val, 20);
assert_eq!(seen, 20);
}
}