raphtory/db/task/
task.rs

1use super::context::GlobalState;
2use crate::{
3    core::state::compute_state::ComputeState,
4    db::{api::view::StaticGraphViewOps, task::node::eval_node::EvalNodeView},
5};
6use std::marker::PhantomData;
7
8pub trait Task<G, CS, S>
9where
10    G: StaticGraphViewOps,
11    CS: ComputeState,
12{
13    fn run<'graph, 'b>(&'b self, vv: &'b mut EvalNodeView<'graph, '_, G, S, &'graph G, CS>)
14        -> Step;
15}
16
17#[derive(Debug, PartialEq)]
18pub enum Step {
19    Done,
20    Continue,
21}
22
23pub struct ATask<G, CS, S: 'static, F>
24where
25    G: StaticGraphViewOps,
26    CS: ComputeState,
27{
28    f: F,
29    _g: PhantomData<G>,
30    _cs: PhantomData<CS>,
31    _s: PhantomData<S>,
32}
33
34impl<G: StaticGraphViewOps, CS: ComputeState, S: 'static, F: Clone> Clone for ATask<G, CS, S, F> {
35    fn clone(&self) -> Self {
36        Self {
37            f: self.f.clone(),
38            _g: PhantomData,
39            _cs: PhantomData,
40            _s: PhantomData,
41        }
42    }
43}
44
45// determines if the task is executed for all nodes or only for updated nodes (nodes that had a state change since last sync)
46pub enum Job<G, CS: ComputeState, S> {
47    Read(Box<dyn Task<G, CS, S> + Sync + Send>),
48    Write(Box<dyn Task<G, CS, S> + Sync + Send>),
49    Check(Box<dyn Fn(&GlobalState<CS>) -> Step + Send + Sync + 'static>),
50}
51
52impl<G: StaticGraphViewOps, CS: ComputeState, S> Job<G, CS, S> {
53    pub fn new<T: Task<G, CS, S> + Send + Sync + 'static>(t: T) -> Self {
54        Self::Write(Box::new(t))
55    }
56
57    pub fn read_only<T: Task<G, CS, S> + Send + Sync + 'static>(t: T) -> Self {
58        Self::Read(Box::new(t))
59    }
60}
61
62impl<G, CS, S, F> ATask<G, CS, S, F>
63where
64    G: StaticGraphViewOps,
65    CS: ComputeState,
66    F: for<'graph, 'a, 'b> Fn(&'b mut EvalNodeView<'graph, 'a, G, S, &'graph G, CS>) -> Step,
67{
68    pub fn new(f: F) -> Self {
69        Self {
70            f,
71            _g: PhantomData,
72            _cs: PhantomData,
73            _s: PhantomData,
74        }
75    }
76}
77
78impl<G, CS, S, F> Task<G, CS, S> for ATask<G, CS, S, F>
79where
80    G: StaticGraphViewOps,
81    CS: ComputeState,
82    F: for<'graph, 'a, 'b> Fn(&'b mut EvalNodeView<'graph, 'a, G, S, &'graph G, CS>) -> Step,
83{
84    fn run<'graph, 'b>(
85        &'b self,
86        vv: &'b mut EvalNodeView<'graph, '_, G, S, &'graph G, CS>,
87    ) -> Step {
88        (self.f)(vv)
89    }
90}