mirror of
https://github.com/adoyle0/leptos-use.git
synced 2025-02-02 10:54:15 -05:00
Merge branch 'main' into fix/use_scroll
This commit is contained in:
commit
399614879a
10 changed files with 222 additions and 172 deletions
|
@ -454,7 +454,6 @@ pub struct UseStorageOptions<T> {
|
||||||
/// Defaults to simply returning the stored value.
|
/// Defaults to simply returning the stored value.
|
||||||
pub(crate) merge_defaults: fn(&str, &T) -> String,
|
pub(crate) merge_defaults: fn(&str, &T) -> String,
|
||||||
/// Optional callback whenever an error occurs. The callback takes an argument of type [`UseStorageError`].
|
/// Optional callback whenever an error occurs. The callback takes an argument of type [`UseStorageError`].
|
||||||
#[builder(into)]
|
|
||||||
pub(crate) on_error: Box<dyn CloneableFnWithArg<UseStorageError>>,
|
pub(crate) on_error: Box<dyn CloneableFnWithArg<UseStorageError>>,
|
||||||
|
|
||||||
/// Debounce or throttle the writing to storage whenever the value changes.
|
/// Debounce or throttle the writing to storage whenever the value changes.
|
||||||
|
|
|
@ -379,7 +379,6 @@ where
|
||||||
/// Custom handler that is called on updates.
|
/// Custom handler that is called on updates.
|
||||||
/// If specified this will override the default behavior.
|
/// If specified this will override the default behavior.
|
||||||
/// To get the default behaviour back you can call the provided `default_handler` function.
|
/// To get the default behaviour back you can call the provided `default_handler` function.
|
||||||
#[builder(into)]
|
|
||||||
on_changed: Box<dyn CloneableFnWithArg<UseColorModeOnChangeArgs>>,
|
on_changed: Box<dyn CloneableFnWithArg<UseColorModeOnChangeArgs>>,
|
||||||
|
|
||||||
/// When provided, `useStorage` will be skipped.
|
/// When provided, `useStorage` will be skipped.
|
||||||
|
|
|
@ -92,7 +92,6 @@ pub struct UseIntervalOptions {
|
||||||
immediate: bool,
|
immediate: bool,
|
||||||
|
|
||||||
/// Callback on every interval.
|
/// Callback on every interval.
|
||||||
#[builder(into)]
|
|
||||||
callback: Box<dyn CloneableFnWithArg<u64>>,
|
callback: Box<dyn CloneableFnWithArg<u64>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,169 +0,0 @@
|
||||||
use std::fmt::Debug;
|
|
||||||
|
|
||||||
pub trait CloneableFnWithReturn<R>: FnOnce() -> R {
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnWithReturn<R>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F, R> CloneableFnWithReturn<R> for F
|
|
||||||
where
|
|
||||||
F: FnOnce() -> R + Clone + 'static,
|
|
||||||
R: 'static,
|
|
||||||
{
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnWithReturn<R>> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R> Clone for Box<dyn CloneableFnWithReturn<R>> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
(**self).clone_box()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R: Default + 'static> Default for Box<dyn CloneableFnWithReturn<R>> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Box::new(|| Default::default())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait CloneableFnWithArgAndReturn<Arg, R>: FnOnce(Arg) -> R {
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnWithArgAndReturn<Arg, R>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F, R, Arg> CloneableFnWithArgAndReturn<Arg, R> for F
|
|
||||||
where
|
|
||||||
F: FnMut(Arg) -> R + Clone + 'static,
|
|
||||||
R: 'static,
|
|
||||||
{
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R, Arg> Clone for Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
(**self).clone_box()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R: Default + 'static, Arg> Default for Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Box::new(|_| Default::default())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait CloneableFn: FnOnce() {
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFn>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F> CloneableFn for F
|
|
||||||
where
|
|
||||||
F: FnOnce() + Clone + 'static,
|
|
||||||
{
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFn> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clone for Box<dyn CloneableFn> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
(**self).clone_box()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Box<dyn CloneableFn> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Box::new(|| {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait CloneableFnWithArg<Arg>: FnOnce(Arg) {
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnWithArg<Arg>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F, Arg> CloneableFnWithArg<Arg> for F
|
|
||||||
where
|
|
||||||
F: FnMut(Arg) + Clone + 'static,
|
|
||||||
{
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnWithArg<Arg>> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Arg> Clone for Box<dyn CloneableFnWithArg<Arg>> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
(**self).clone_box()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Arg> Default for Box<dyn CloneableFnWithArg<Arg>> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Box::new(|_| {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait CloneableFnMutWithArg<Arg>: FnMut(Arg) {
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnMutWithArg<Arg>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F, Arg> CloneableFnMutWithArg<Arg> for F
|
|
||||||
where
|
|
||||||
F: FnMut(Arg) + Clone + 'static,
|
|
||||||
{
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnMutWithArg<Arg>> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Arg> Clone for Box<dyn CloneableFnMutWithArg<Arg>> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
(**self).clone_box()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Arg> Default for Box<dyn CloneableFnMutWithArg<Arg>> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Box::new(|_| {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Arg> Debug for Box<dyn CloneableFnMutWithArg<Arg>> {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(
|
|
||||||
f,
|
|
||||||
"Box<dyn CloneableFnMutWithArg<{}>>",
|
|
||||||
std::any::type_name::<Arg>()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait CloneableFnMut: FnMut() {
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnMut>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F> CloneableFnMut for F
|
|
||||||
where
|
|
||||||
F: FnMut() + Clone + 'static,
|
|
||||||
{
|
|
||||||
fn clone_box(&self) -> Box<dyn CloneableFnMut> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clone for Box<dyn CloneableFnMut> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
(**self).clone_box()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Box<dyn CloneableFnMut> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Box::new(|| {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Debug for Box<dyn CloneableFnMut> {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "Box<dyn CloneableFnMut>",)
|
|
||||||
}
|
|
||||||
}
|
|
43
src/utils/clonable_fn/mod.rs
Normal file
43
src/utils/clonable_fn/mod.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
mod mut_;
|
||||||
|
mod mut_with_arg;
|
||||||
|
mod with_arg;
|
||||||
|
mod with_arg_and_return;
|
||||||
|
mod with_return;
|
||||||
|
|
||||||
|
pub use mut_::*;
|
||||||
|
pub use mut_with_arg::*;
|
||||||
|
use std::fmt::Debug;
|
||||||
|
pub use with_arg::*;
|
||||||
|
pub use with_arg_and_return::*;
|
||||||
|
pub use with_return::*;
|
||||||
|
|
||||||
|
pub trait CloneableFn: FnOnce() {
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFn>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> CloneableFn for F
|
||||||
|
where
|
||||||
|
F: FnOnce() + Clone + 'static,
|
||||||
|
{
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFn> {
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for Box<dyn CloneableFn> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Box<dyn CloneableFn> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Box::new(|| {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Debug for Box<dyn CloneableFn> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "Box<dyn CloneableFn>",)
|
||||||
|
}
|
||||||
|
}
|
32
src/utils/clonable_fn/mut_.rs
Normal file
32
src/utils/clonable_fn/mut_.rs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
pub trait CloneableFnMut: FnMut() {
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnMut>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> CloneableFnMut for F
|
||||||
|
where
|
||||||
|
F: FnMut() + Clone + 'static,
|
||||||
|
{
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnMut> {
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for Box<dyn CloneableFnMut> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Box<dyn CloneableFnMut> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Box::new(|| {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Debug for Box<dyn CloneableFnMut> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "Box<dyn CloneableFnMut>",)
|
||||||
|
}
|
||||||
|
}
|
36
src/utils/clonable_fn/mut_with_arg.rs
Normal file
36
src/utils/clonable_fn/mut_with_arg.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
pub trait CloneableFnMutWithArg<Arg>: FnMut(Arg) {
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnMutWithArg<Arg>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F, Arg> CloneableFnMutWithArg<Arg> for F
|
||||||
|
where
|
||||||
|
F: FnMut(Arg) + Clone + 'static,
|
||||||
|
{
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnMutWithArg<Arg>> {
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Arg> Clone for Box<dyn CloneableFnMutWithArg<Arg>> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Arg> Default for Box<dyn CloneableFnMutWithArg<Arg>> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Box::new(|_| {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Arg> Debug for Box<dyn CloneableFnMutWithArg<Arg>> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"Box<dyn CloneableFnMutWithArg<{}>>",
|
||||||
|
std::any::type_name::<Arg>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
36
src/utils/clonable_fn/with_arg.rs
Normal file
36
src/utils/clonable_fn/with_arg.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
pub trait CloneableFnWithArg<Arg>: FnOnce(Arg) {
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnWithArg<Arg>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F, Arg> CloneableFnWithArg<Arg> for F
|
||||||
|
where
|
||||||
|
F: FnOnce(Arg) + Clone + 'static,
|
||||||
|
{
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnWithArg<Arg>> {
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Arg> Clone for Box<dyn CloneableFnWithArg<Arg>> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Arg> Default for Box<dyn CloneableFnWithArg<Arg>> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Box::new(|_| {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Arg> Debug for Box<dyn CloneableFnWithArg<Arg>> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"Box<dyn CloneableFnWithArg<{}>>",
|
||||||
|
std::any::type_name::<Arg>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
38
src/utils/clonable_fn/with_arg_and_return.rs
Normal file
38
src/utils/clonable_fn/with_arg_and_return.rs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
pub trait CloneableFnWithArgAndReturn<Arg, R>: FnOnce(Arg) -> R {
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnWithArgAndReturn<Arg, R>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F, R, Arg> CloneableFnWithArgAndReturn<Arg, R> for F
|
||||||
|
where
|
||||||
|
F: FnMut(Arg) -> R + Clone + 'static,
|
||||||
|
R: 'static,
|
||||||
|
{
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R, Arg> Clone for Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: Default + 'static, Arg> Default for Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Box::new(|_| Default::default())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R, Arg> Debug for Box<dyn CloneableFnWithArgAndReturn<Arg, R>> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"Box<dyn CloneableFnWithArgAndReturn<{}, {}>>",
|
||||||
|
std::any::type_name::<Arg>(),
|
||||||
|
std::any::type_name::<R>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
37
src/utils/clonable_fn/with_return.rs
Normal file
37
src/utils/clonable_fn/with_return.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
pub trait CloneableFnWithReturn<R>: FnOnce() -> R {
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnWithReturn<R>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F, R> CloneableFnWithReturn<R> for F
|
||||||
|
where
|
||||||
|
F: FnOnce() -> R + Clone + 'static,
|
||||||
|
R: 'static,
|
||||||
|
{
|
||||||
|
fn clone_box(&self) -> Box<dyn CloneableFnWithReturn<R>> {
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R> Clone for Box<dyn CloneableFnWithReturn<R>> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: Default + 'static> Default for Box<dyn CloneableFnWithReturn<R>> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Box::new(|| Default::default())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R> Debug for Box<dyn CloneableFnWithReturn<R>> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"Box<dyn CloneableFnWithReturn<{}>>",
|
||||||
|
std::any::type_name::<R>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue