leptos-use 0.18.3

Collection of essential Leptos utilities inspired by React-Use / VueUse
Documentation
use std::{marker::PhantomData, ops::Deref};

use leptos::prelude::*;

pub struct UseRwSignal<R, W, T>(R, W, PhantomData<T>)
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static;

impl<RW, T> From<RW> for UseRwSignal<RW, RW, T>
where
    RW: Read + Copy,
    <RW as Read>::Value: Deref<Target = T>,
    RW: Write<Value = T> + Copy,
    T: 'static,
{
    fn from(s: RW) -> Self {
        Self(s, s, PhantomData)
    }
}

impl<T, R, W> From<(R, W)> for UseRwSignal<R, W, T>
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    fn from((r, w): (R, W)) -> Self {
        Self(r, w, PhantomData)
    }
}

impl<T> Default for UseRwSignal<RwSignal<T>, RwSignal<T>, T>
where
    T: Default + Send + Sync,
{
    fn default() -> Self {
        let signal = Default::default();
        Self(signal, signal, PhantomData)
    }
}

impl<T> Default for UseRwSignal<RwSignal<T, LocalStorage>, RwSignal<T, LocalStorage>, T>
where
    T: Default,
{
    fn default() -> Self {
        let signal = Default::default();
        Self(signal, signal, PhantomData)
    }
}

impl<R, W, T> Clone for UseRwSignal<R, W, T>
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    fn clone(&self) -> Self {
        *self
    }
}

impl<R, W, T> Copy for UseRwSignal<R, W, T>
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
}

impl<R, W, T> DefinedAt for UseRwSignal<R, W, T>
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    #[inline(always)]
    fn defined_at(&self) -> Option<&'static std::panic::Location<'static>> {
        self.0.defined_at()
    }
}

impl<R, W, T> ReadUntracked for UseRwSignal<R, W, T>
where
    R: Read + Copy + ReadUntracked,
    <R as ReadUntracked>::Value: Deref<Target = T>,
    <R as Read>::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    type Value = <R as ReadUntracked>::Value;

    #[inline(always)]
    fn try_read_untracked(&self) -> Option<Self::Value> {
        self.0.try_read_untracked()
    }
}

impl<R, W, T> Notify for UseRwSignal<R, W, T>
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    #[inline(always)]
    fn notify(&self) {
        self.1.notify()
    }
}

impl<R, W, T> Write for UseRwSignal<R, W, T>
where
    R: Read + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    type Value = T;

    #[inline(always)]
    fn try_write(&self) -> Option<impl UntrackableGuard<Target = Self::Value>> {
        self.1.try_write()
    }

    #[inline(always)]
    fn try_write_untracked(&self) -> Option<impl std::ops::DerefMut<Target = Self::Value>> {
        self.1.try_write_untracked()
    }
}

impl<R, W, T> Track for UseRwSignal<R, W, T>
where
    R: Read + Track + Copy,
    R::Value: Deref<Target = T>,
    W: Write<Value = T> + Copy,
    T: 'static,
{
    fn track(&self) {
        self.0.track();
    }
}