hooks 3.0.0-alpha.15

Compile-time, async hooks
Documentation
#![cfg(all(feature = "futures-core", feature = "all"))]

use futures_lite::StreamExt;
use hooks::ShareValue;
use hooks_core::{prelude::*, HookExt};

mod utils;
use utils::test_many_async;

test_many_async!(use_1_hook(
    {
        hook_fn!(
            fn use_shared_state() -> u32 {
                let state = h![hooks::use_shared_signal(3)];
                state.get()
            }
        );

        let values = use_shared_state()
            .into_hook_values()
            .collect::<Vec<_>>()
            .await;
        assert_eq!(values, [3]);
    },
    {
        hook_fn!(
            fn use_shared_state_borrowing<'a>(
                initial_value: &'a str,
            ) -> &'hook hooks::SharedSignal<&'a str> {
                let state = h!(hooks::use_shared_signal(initial_value));
                state
            }
        );

        let hello = "hello".to_owned();
        let msg = hello + " world!";
        let initial_value: &str = &msg;
        let mut hook = use_shared_state_borrowing(initial_value).into_hook();

        assert_eq!(hook.next_value().await.unwrap().get(), "hello world!");
        assert!(hook.next_value().await.is_none());
    },
    {
        hook_fn!(
            type Bounds = impl 'a;
            fn use_borrow_mut<'a, T: Default>(values: &'a mut Vec<T>) {
                values.push(T::default())
            }
        );

        let mut values = vec![];

        let results = use_borrow_mut::<String>(&mut values)
            .into_hook_values()
            .collect::<Vec<_>>()
            .await;

        assert_eq!(results, [()]);
        assert_eq!(values, [""]);
    },
));