pub mod builtin;
pub mod debounced_input;
pub mod head;
pub mod reg;
pub mod storage;
pub mod vm;
use bevy_app::{App, Plugin, Update};
pub use builtin::{BuiltinNodes, Builtins};
use gantz_core::Node;
pub use head::{
CompiledModule, FocusedHead, HeadRef, HeadTabOrder, HeadVms, OpenHead, OpenHeadData,
OpenHeadDataReadOnly, WorkingGraph,
};
pub use reg::{Registry, lookup_node, timestamp};
pub use vm::{EvalCompleted, EvalEvent, EvalKind};
pub struct GantzPlugin<N>(std::marker::PhantomData<N>);
impl<N> Default for GantzPlugin<N> {
fn default() -> Self {
Self(std::marker::PhantomData)
}
}
impl<N> Plugin for GantzPlugin<N>
where
N: 'static + Node + Clone + gantz_ca::CaHash + Send + Sync,
{
fn build(&self, app: &mut App) {
app.init_resource::<FocusedHead>()
.init_resource::<HeadTabOrder>()
.init_resource::<Registry<N>>()
.init_non_send_resource::<HeadVms>()
.add_observer(head::on_open::<N>)
.add_observer(head::on_replace::<N>)
.add_observer(head::on_close::<N>)
.add_observer(head::on_branch::<N>)
.add_observer(head::on_move_branch::<N>)
.add_observer(vm::on_eval)
.add_observer(vm::on_head_opened::<N>)
.add_observer(vm::on_head_changed::<N>)
.add_systems(Update, vm::update::<N>);
}
}
pub fn clone_graph<N: Clone>(
graph: &gantz_core::node::graph::Graph<N>,
) -> gantz_core::node::graph::Graph<N> {
graph.map(|_, n| n.clone(), |_, e| *e)
}