use crate::{Hook, Hooks};
mod private {
pub trait Sealed {}
impl Sealed for crate::Hooks<'_, '_> {}
}
pub trait UseConst: private::Sealed {
fn use_const<F, T>(&mut self, f: F) -> T
where
F: FnOnce() -> T,
T: Clone + Send + Unpin + 'static;
fn use_const_default<T>(&mut self) -> T
where
T: Clone + Default + Send + Unpin + 'static;
}
impl UseConst for Hooks<'_, '_> {
fn use_const<F, T>(&mut self, f: F) -> T
where
F: FnOnce() -> T,
T: Clone + Send + Unpin + 'static,
{
let hook = self.use_hook(move || UseConstImpl { value: f() });
hook.value.clone()
}
fn use_const_default<T>(&mut self) -> T
where
T: Clone + Default + Send + Unpin + 'static,
{
self.use_const(T::default)
}
}
struct UseConstImpl<T> {
value: T,
}
impl<T: Send + Unpin> Hook for UseConstImpl<T> {}
#[cfg(test)]
mod tests {
use crate::prelude::*;
#[derive(Clone, Default)]
struct MyStruct(u64);
#[component]
fn MyComponent(mut hooks: Hooks) -> impl Into<AnyElement<'static>> {
let a = hooks.use_const(|| 42);
let b: MyStruct = hooks.use_const_default();
let c = hooks.use_const(|| "hello!");
assert_eq!(a, 42);
assert_eq!(b.0, 0);
assert_eq!(c, "hello!");
element!(View)
}
#[test]
fn test_use_const() {
let s = element!(MyComponent).to_string();
assert_eq!(s, "");
}
}