Merge pull request #111 from Philipp-M/memoize-adapt-configurable-trait-bounds

Make function trait-bounds of the `Memoize`, `Adapt` and `AdaptState` views configurable (mostly to mirror the `View` trait bounds)
This commit is contained in:
Philipp Mildenberger 2023-07-24 12:34:33 +02:00 committed by GitHub
commit 4409fbb8df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 21 deletions

View File

@ -1,6 +1,6 @@
#[macro_export]
macro_rules! generate_adapt_view {
($viewtrait:ident, $cx:ty, $changeflags:ty) => {
($viewtrait:ident, $cx:ty, $changeflags:ty; $($ss:tt)*) => {
/// A view that wraps a child view and modifies the state that callbacks have access to.
///
/// # Examples
@ -81,7 +81,7 @@ macro_rules! generate_adapt_view {
impl<ParentT, ParentA, ChildT, ChildA, V, F> Adapt<ParentT, ParentA, ChildT, ChildA, V, F>
where
V: $viewtrait<ChildT, ChildA>,
F: Fn(&mut ParentT, AdaptThunk<ChildT, ChildA, V>) -> $crate::MessageResult<ParentA>,
F: Fn(&mut ParentT, AdaptThunk<ChildT, ChildA, V>) -> $crate::MessageResult<ParentA> $( $ss )*,
{
pub fn new(f: F, child: V) -> Self {
Adapt {
@ -103,8 +103,7 @@ macro_rules! generate_adapt_view {
for Adapt<ParentT, ParentA, ChildT, ChildA, V, F>
where
V: $viewtrait<ChildT, ChildA>,
F: Fn(&mut ParentT, AdaptThunk<ChildT, ChildA, V>) -> $crate::MessageResult<ParentA>
+ Send,
F: Fn(&mut ParentT, AdaptThunk<ChildT, ChildA, V>) -> $crate::MessageResult<ParentA> $( $ss )*,
{
type State = V::State;
@ -146,7 +145,7 @@ macro_rules! generate_adapt_view {
for Adapt<ParentT, ParentA, ChildT, ChildA, V, F>
where
V: $viewtrait<ChildT, ChildA>,
F: Fn(&mut ParentT, AdaptThunk<ChildT, ChildA, V>) -> $crate::MessageResult<ParentA>,
F: Fn(&mut ParentT, AdaptThunk<ChildT, ChildA, V>) -> $crate::MessageResult<ParentA> $( $ss )*,
{
}
};
@ -154,7 +153,7 @@ macro_rules! generate_adapt_view {
#[macro_export]
macro_rules! generate_adapt_state_view {
($viewtrait:ident, $cx:ty, $changeflags:ty) => {
($viewtrait:ident, $cx:ty, $changeflags:ty; $($ss:tt)*) => {
/// A view that wraps a child view and modifies the state that callbacks have access to.
pub struct AdaptState<ParentT, ChildT, V, F = fn(&mut ParentT) -> &mut ChildT> {
f: F,
@ -164,7 +163,7 @@ macro_rules! generate_adapt_state_view {
impl<ParentT, ChildT, V, F> AdaptState<ParentT, ChildT, V, F>
where
F: Fn(&mut ParentT) -> &mut ChildT + Send,
F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*,
{
pub fn new(f: F, child: V) -> Self {
Self {
@ -178,7 +177,7 @@ macro_rules! generate_adapt_state_view {
impl<ParentT, ChildT, A, V, F> $viewtrait<ParentT, A> for AdaptState<ParentT, ChildT, V, F>
where
V: $viewtrait<ChildT, A>,
F: Fn(&mut ParentT) -> &mut ChildT + Send,
F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*,
{
type State = V::State;
type Element = V::Element;
@ -211,7 +210,7 @@ macro_rules! generate_adapt_state_view {
}
impl<ParentT, ChildT, V, F> ViewMarker for AdaptState<ParentT, ChildT, V, F> where
F: Fn(&mut ParentT) -> &mut ChildT
F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*
{
}
};

View File

@ -10,7 +10,8 @@ macro_rules! generate_memoize_view {
$cx:ty,
$changeflags:ty,
$staticviewfunction:ident,
$memoizeviewfunction:ident
$memoizeviewfunction:ident;
$($ss:tt)*
) => {
pub struct $memoizeview<D, F> {
data: D,
@ -36,9 +37,9 @@ macro_rules! generate_memoize_view {
impl<T, A, D, V, F> $viewtrait<T, A> for $memoizeview<D, F>
where
D: PartialEq + Send + 'static,
D: PartialEq $( $ss )* + 'static,
V: $viewtrait<T, A>,
F: Fn(&D) -> V + Send,
F: Fn(&D) -> V $( $ss )*,
{
type State = $memoizestate<T, A, V>;
@ -93,7 +94,7 @@ macro_rules! generate_memoize_view {
/// A static view, all of the content of the `view` should be constant, as this function is only run once
pub fn $staticviewfunction<V, F>(view: F) -> $memoizeview<(), impl Fn(&()) -> V>
where
F: Fn() -> V + 'static,
F: Fn() -> V $( $ss )* + 'static,
{
$memoizeview::new((), move |_: &()| view())
}
@ -101,7 +102,7 @@ macro_rules! generate_memoize_view {
/// Memoize the view, until the `data` changes (in which case `view` is called again)
pub fn $memoizeviewfunction<D, V, F>(data: D, view: F) -> $memoizeview<D, F>
where
F: Fn(&D) -> V,
F: Fn(&D) -> V $( $ss )*,
{
$memoizeview::new(data, view)
}

View File

@ -100,9 +100,9 @@ impl Pod {
xilem_core::generate_view_trait! {View, DomNode, Cx, ChangeFlags;}
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomNode, Cx, ChangeFlags, Pod;}
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyNode, BoxedView;}
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags}
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize;}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags;}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags;}
/// This view container can switch between two views.
///

View File

@ -75,4 +75,6 @@ impl Pod {
xilem_core::generate_view_trait! {View, DomElement, Cx, ChangeFlags;}
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomElement, Cx, ChangeFlags, Pod;}
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyElement, BoxedView;}
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize;}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags;}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags;}

View File

@ -26,9 +26,9 @@ use crate::widget::{AnyWidget, ChangeFlags, Pod, Widget};
xilem_core::generate_view_trait! {View, Widget, Cx, ChangeFlags; : Send}
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, Widget, Cx, ChangeFlags, Pod; : Send}
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyWidget, BoxedView; + Send}
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags}
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize; + Send}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags; + Send}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags; + Send}
#[derive(Clone)]
pub struct Cx {