mirror of https://github.com/linebender/xilem
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:
commit
4409fbb8df
|
@ -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 )*
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
///
|
///
|
||||||
|
|
|
@ -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;}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue