use crate::dom::RefFn; pub use crate::animation::AnimatedSignalVec; pub trait StaticEvent { const EVENT_TYPE: &'static str; fn unchecked_from_event(event: web_sys::Event) -> Self; } #[deprecated(since = "0.3.2", note = "Use the apply or apply_if methods instead")] pub trait Mixin { fn apply(self, builder: A) -> A; } #[allow(deprecated)] impl Mixin for F where F: FnOnce(A) -> A { #[inline] fn apply(self, builder: A) -> A { self(builder) } } // TODO figure out a way to implement this for all of AsRef / Borrow / etc. // TODO implementations for &String and &mut String pub trait AsStr { fn as_str(&self) -> &str; } impl<'a, A> AsStr for &'a A where A: AsStr { #[inline] fn as_str(&self) -> &str { AsStr::as_str(*self) } } impl AsStr for String { #[inline] fn as_str(&self) -> &str { self } } impl AsStr for str { #[inline] fn as_str(&self) -> &str { self } } impl<'a> AsStr for &'a str { #[inline] fn as_str(&self) -> &str { self } } impl AsStr for RefFn where C: Fn(&A) -> &str { #[inline] fn as_str(&self) -> &str { self.call_ref() } } pub trait MultiStr { fn any(&self, f: F) -> bool where F: FnMut(&str) -> bool; #[inline] fn each(&self, mut f: F) where F: FnMut(&str) { self.any(|x| { f(x); false }); } } impl MultiStr for A where A: AsStr { #[inline] fn any(&self, mut f: F) -> bool where F: FnMut(&str) -> bool { f(self.as_str()) } } // TODO it would be great to use IntoIterator instead, and then we can replace the array implementations with it /*impl<'a, A> MultiStr for &'a [A] where A: AsStr { #[inline] fn any(&self, mut f: F) -> bool where F: FnMut(&str) -> bool { self.iter().any(|x| f(x.as_str())) } }*/ // TODO it would be great to use IntoIterator or Iterator instead impl<'a, A, C> MultiStr for RefFn where C: Fn(&A) -> &[&'a str] { #[inline] fn any(&self, mut f: F) -> bool where F: FnMut(&str) -> bool { self.call_ref().iter().any(|x| f(x)) } } macro_rules! array_multi_str { ($size:expr) => { impl MultiStr for [A; $size] where A: AsStr { #[inline] fn any(&self, mut f: F) -> bool where F: FnMut(&str) -> bool { self.iter().any(|x| f(x.as_str())) } } }; } macro_rules! array_multi_strs { ($($size:expr),*) => { $(array_multi_str!($size);)* }; } array_multi_strs!(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32); pub trait OptionStr { type Output; fn into_option(self) -> Option; } impl OptionStr for A where A: MultiStr { type Output = A; #[inline] fn into_option(self) -> Option { Some(self) } } impl OptionStr for Option where A: MultiStr { type Output = A; #[inline] fn into_option(self) -> Option { self } }