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
45pub 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}