diff --git a/Cargo.toml b/Cargo.toml
index 370b60156..a523e1fca 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,7 +19,7 @@ members = [
"packages/rsx",
"packages/native-core",
"packages/native-core-macro",
- "packages/edit-stream",
+ # "packages/edit-stream",
"docs/guide",
]
diff --git a/packages/core-macro/src/lib.rs b/packages/core-macro/src/lib.rs
index de0155e14..e1c445262 100644
--- a/packages/core-macro/src/lib.rs
+++ b/packages/core-macro/src/lib.rs
@@ -11,8 +11,7 @@ use dioxus_rsx as rsx;
#[proc_macro]
pub fn format_args_f(input: TokenStream) -> TokenStream {
use rsx::*;
- let item = parse_macro_input!(input as IfmtInput);
- format_args_f_impl(item)
+ format_args_f_impl(parse_macro_input!(input as IfmtInput))
.unwrap_or_else(|err| err.to_compile_error())
.into()
}
diff --git a/packages/core/src.old/scopes.rs b/packages/core/src.old/scopes.rs
index be14cc4b2..24550bc38 100644
--- a/packages/core/src.old/scopes.rs
+++ b/packages/core/src.old/scopes.rs
@@ -424,7 +424,6 @@ impl
Clone for Scope<'_, P> {
}
impl<'a, P> std::ops::Deref for Scope<'a, P> {
- // rust will auto deref again to the original 'a lifetime at the call site
type Target = &'a ScopeState;
fn deref(&self) -> &Self::Target {
&self.scope
@@ -621,9 +620,6 @@ impl ScopeState {
Arc::new(move |id| drop(chan.unbounded_send(SchedulerMsg::Immediate(id))))
}
- /// Get the [`ScopeId`] of a mounted component.
- ///
- /// `ScopeId` is not unique for the lifetime of the [`VirtualDom`] - a [`ScopeId`] will be reused if a component is unmounted.
pub fn needs_update(&self) {
self.needs_update_any(self.scope_id());
}
diff --git a/packages/core/src/any_props.rs b/packages/core/src/any_props.rs
index e7828ed0c..199d5cc5b 100644
--- a/packages/core/src/any_props.rs
+++ b/packages/core/src/any_props.rs
@@ -1,7 +1,9 @@
use std::cell::Cell;
+use futures_util::Future;
+
use crate::{
- component::Component,
+ component::{Component, ComponentFn, Dummy, IntoComponent},
element::Element,
scopes::{Scope, ScopeState},
};
@@ -12,21 +14,18 @@ pub trait AnyProps {
unsafe fn memoize(&self, other: &dyn AnyProps) -> bool;
}
-pub(crate) struct VComponentProps
{
- pub render_fn: Component
,
+pub(crate) struct VComponentProps
= Dummy> {
+ pub render_fn: ComponentFn
,
pub memo: unsafe fn(&P, &P) -> bool,
- pub props: Scope
,
+ pub props: *const P,
}
impl VComponentProps<()> {
pub fn new_empty(render_fn: Component<()>) -> Self {
Self {
- render_fn,
+ render_fn: render_fn.into_component(),
memo: <() as PartialEq>::eq,
- props: Scope {
- props: (),
- state: Cell::new(std::ptr::null_mut()),
- },
+ props: std::ptr::null_mut(),
}
}
}
@@ -35,10 +34,10 @@ impl
VComponentProps
{
pub(crate) fn new(
render_fn: Component
,
memo: unsafe fn(&P, &P) -> bool,
- props: Scope
,
+ props: *const P,
) -> Self {
Self {
- render_fn,
+ render_fn: render_fn.into_component(),
memo,
props,
}
@@ -62,10 +61,18 @@ impl
AnyProps for VComponentProps
{
fn render<'a>(&'a self, scope: &'a ScopeState) -> Element<'a> {
// Make sure the scope ptr is not null
- self.props.state.set(scope);
+ // self.props.state.set(scope);
+
+ let scope = Scope {
+ props: unsafe { &*self.props },
+ scope,
+ };
// Call the render function directly
// todo: implement async
- (self.render_fn)(unsafe { std::mem::transmute(&self.props) })
+ match self.render_fn {
+ ComponentFn::Sync(f) => f(scope),
+ ComponentFn::Async(_) => todo!(),
+ }
}
}
diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs
index 231b554ad..02b9ad994 100644
--- a/packages/core/src/arena.rs
+++ b/packages/core/src/arena.rs
@@ -1,30 +1,32 @@
use std::num::NonZeroUsize;
+use crate::{
+ nodes::{Template, VNode},
+ virtualdom::VirtualDom,
+};
+
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct ElementId(pub usize);
-// pub struct ElementId(pub NonZeroUsize);
-
-// impl Default for ElementId {
-// fn default() -> Self {
-// Self(NonZeroUsize::new(1).unwrap())
-// }
-// }
-
-pub struct ElementArena {
- counter: usize,
+pub struct ElementPath {
+ pub template: *mut VNode<'static>,
+ pub element: usize,
}
-impl Default for ElementArena {
- fn default() -> Self {
- Self { counter: 1 }
- }
-}
+impl VirtualDom {
+ pub fn next_element(&mut self, template: &VNode) -> ElementId {
+ let entry = self.elements.vacant_entry();
+ let id = entry.key();
+
+ entry.insert(ElementPath {
+ template: template as *const _ as *mut _,
+ element: id,
+ });
-impl ElementArena {
- pub fn next(&mut self) -> ElementId {
- let id = self.counter;
- self.counter += 1;
ElementId(id)
}
+
+ pub fn cleanup_element(&mut self, id: ElementId) {
+ self.elements.remove(id.0);
+ }
}
diff --git a/packages/core/src/bump_frame.rs b/packages/core/src/bump_frame.rs
index 57ddbdc3a..8b3f3b86b 100644
--- a/packages/core/src/bump_frame.rs
+++ b/packages/core/src/bump_frame.rs
@@ -2,11 +2,11 @@ use std::cell::Cell;
use bumpalo::Bump;
-use crate::nodes::VTemplate;
+use crate::nodes::VNode;
pub struct BumpFrame {
pub bump: Bump,
- pub node: Cell<*const VTemplate<'static>>,
+ pub node: Cell<*const VNode<'static>>,
}
impl BumpFrame {
pub fn new(capacity: usize) -> Self {
diff --git a/packages/core/src/component.rs b/packages/core/src/component.rs
index 53825a33c..153a562e3 100644
--- a/packages/core/src/component.rs
+++ b/packages/core/src/component.rs
@@ -2,6 +2,44 @@
// fn into_component_type(self) -> ComponentType;
// }
+use futures_util::Future;
+
use crate::{element::Element, scopes::Scope};
-pub type Component = fn(&Scope) -> Element;
+pub type Component = fn(Scope) -> Element;
+
+pub enum ComponentFn = Dummy> {
+ Sync(fn(Scope) -> Element),
+ Async(fn(Scope) -> F),
+}
+
+pub trait IntoComponent {
+ fn into_component(self) -> ComponentFn;
+}
+
+impl IntoComponent for fn(Scope) -> Element {
+ fn into_component(self) -> ComponentFn {
+ ComponentFn::Sync(self)
+ }
+}
+
+pub struct AsyncMarker;
+impl<'a, T, F: Future