virtualviewdom

a virtual view transaction renderer for the dom

Build Examples

bash $ cargo install cargo-web bash $ make

```rust

![feature(constatomicisize_new)]

extern crate stdweb;

[macro_use]

extern crate serde_json;

[macro_use]

extern crate virtualview; extern crate virtualview_dom;

use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicIsize, Ordering};

use stdweb::web::{document, set_timeout};

use virtualview::{EventManager, Event, View, Renderer}; use virtualview_dom::Patcher;

static COUNT: AtomicIsize = AtomicIsize::new(0isize); static mut PATCHER: Option = None; static mut RENDERER: Option = None; static mut EVENTMANAGER: Option>> = None;

fn onaddcount(: &mut Event) { COUNT.fetchadd(1, Ordering::Relaxed); enqueuerender(); } fn onsubcount(: &mut Event) { COUNT.fetchsub(1, Ordering::Relaxed); enqueuerender(); }

fn counterrender(count: isize) -> View { virtualview! {

} }

fn render() { let patcher = unsafe { PATCHER.asmut().unwrap() }; let renderer = unsafe { RENDERER.asmut().unwrap() }; let eventmanager = unsafe { EVENTMANAGER.asref().unwrap() }; let count = COUNT.load(Ordering::Relaxed); let view = counterrender(count); let transaction = renderer.render(view, &mut *eventmanager.lock().expect("failed to acquire eventmanager lock")); patcher.patch(&transaction); }

fn enqueuerender() { settimeout(render, 0); }

fn main() { stdweb::initialize();

let event_manager = Arc::new(Mutex::new(EventManager::new()));
let patcher = Patcher::new(document().get_element_by_id("app").unwrap().into(), document(), event_manager.clone());
let renderer = Renderer::new();

unsafe {
    PATCHER = Some(patcher);
    RENDERER = Some(renderer);
    EVENT_MANAGER = Some(event_manager);
}

enqueue_render();

stdweb::event_loop();

} ```