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_export]
macro_rules! generate_adapt_view { 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. /// A view that wraps a child view and modifies the state that callbacks have access to.
/// ///
/// # Examples /// # Examples
@ -81,7 +81,7 @@ macro_rules! generate_adapt_view {
impl<ParentT, ParentA, ChildT, ChildA, V, F> Adapt<ParentT, ParentA, ChildT, ChildA, V, F> impl<ParentT, ParentA, ChildT, ChildA, V, F> Adapt<ParentT, ParentA, ChildT, ChildA, V, F>
where where
V: $viewtrait<ChildT, ChildA>, 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 { pub fn new(f: F, child: V) -> Self {
Adapt { Adapt {
@ -103,8 +103,7 @@ macro_rules! generate_adapt_view {
for Adapt<ParentT, ParentA, ChildT, ChildA, V, F> for Adapt<ParentT, ParentA, ChildT, ChildA, V, F>
where where
V: $viewtrait<ChildT, ChildA>, 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 )*,
+ Send,
{ {
type State = V::State; type State = V::State;
@ -146,7 +145,7 @@ macro_rules! generate_adapt_view {
for Adapt<ParentT, ParentA, ChildT, ChildA, V, F> for Adapt<ParentT, ParentA, ChildT, ChildA, V, F>
where where
V: $viewtrait<ChildT, ChildA>, 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_export]
macro_rules! generate_adapt_state_view { 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. /// 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> { pub struct AdaptState<ParentT, ChildT, V, F = fn(&mut ParentT) -> &mut ChildT> {
f: F, f: F,
@ -164,7 +163,7 @@ macro_rules! generate_adapt_state_view {
impl<ParentT, ChildT, V, F> AdaptState<ParentT, ChildT, V, F> impl<ParentT, ChildT, V, F> AdaptState<ParentT, ChildT, V, F>
where where
F: Fn(&mut ParentT) -> &mut ChildT + Send, F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*,
{ {
pub fn new(f: F, child: V) -> Self { pub fn new(f: F, child: V) -> Self {
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> impl<ParentT, ChildT, A, V, F> $viewtrait<ParentT, A> for AdaptState<ParentT, ChildT, V, F>
where where
V: $viewtrait<ChildT, A>, V: $viewtrait<ChildT, A>,
F: Fn(&mut ParentT) -> &mut ChildT + Send, F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*,
{ {
type State = V::State; type State = V::State;
type Element = V::Element; 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 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, $cx:ty,
$changeflags:ty, $changeflags:ty,
$staticviewfunction:ident, $staticviewfunction:ident,
$memoizeviewfunction:ident $memoizeviewfunction:ident;
$($ss:tt)*
) => { ) => {
pub struct $memoizeview<D, F> { pub struct $memoizeview<D, F> {
data: D, data: D,
@ -36,9 +37,9 @@ macro_rules! generate_memoize_view {
impl<T, A, D, V, F> $viewtrait<T, A> for $memoizeview<D, F> impl<T, A, D, V, F> $viewtrait<T, A> for $memoizeview<D, F>
where where
D: PartialEq + Send + 'static, D: PartialEq $( $ss )* + 'static,
V: $viewtrait<T, A>, V: $viewtrait<T, A>,
F: Fn(&D) -> V + Send, F: Fn(&D) -> V $( $ss )*,
{ {
type State = $memoizestate<T, A, V>; 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 /// 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> pub fn $staticviewfunction<V, F>(view: F) -> $memoizeview<(), impl Fn(&()) -> V>
where where
F: Fn() -> V + 'static, F: Fn() -> V $( $ss )* + 'static,
{ {
$memoizeview::new((), move |_: &()| view()) $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) /// 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> pub fn $memoizeviewfunction<D, V, F>(data: D, view: F) -> $memoizeview<D, F>
where where
F: Fn(&D) -> V, F: Fn(&D) -> V $( $ss )*,
{ {
$memoizeview::new(data, view) $memoizeview::new(data, view)
} }

View File

@ -100,9 +100,9 @@ impl Pod {
xilem_core::generate_view_trait! {View, DomNode, Cx, ChangeFlags;} xilem_core::generate_view_trait! {View, DomNode, Cx, ChangeFlags;}
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomNode, Cx, ChangeFlags, Pod;} 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_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_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize;}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags} xilem_core::generate_adapt_view! {View, Cx, ChangeFlags;}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags} xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags;}
/// This view container can switch between two views. /// 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_view_trait! {View, DomElement, Cx, ChangeFlags;}
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomElement, Cx, ChangeFlags, Pod;} 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_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_view_trait! {View, Widget, Cx, ChangeFlags; : Send}
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, Widget, Cx, ChangeFlags, Pod; : 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_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_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize; + Send}
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags} xilem_core::generate_adapt_view! {View, Cx, ChangeFlags; + Send}
xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags} xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags; + Send}
#[derive(Clone)] #[derive(Clone)]
pub struct Cx { pub struct Cx {