ruvector_graph_node/
streaming.rs1use crate::types::*;
4use futures::stream::Stream;
5use napi::bindgen_prelude::*;
6use napi_derive::napi;
7use std::pin::Pin;
8use std::task::{Context, Poll};
9
10#[napi]
12pub struct QueryResultStream {
13 inner: Pin<Box<dyn Stream<Item = JsQueryResult> + Send>>,
14}
15
16impl QueryResultStream {
17 pub fn new(stream: Pin<Box<dyn Stream<Item = JsQueryResult> + Send>>) -> Self {
19 Self { inner: stream }
20 }
21}
22
23#[napi]
24impl QueryResultStream {
25 #[napi]
37 pub fn next(&mut self) -> Result<Option<JsQueryResult>> {
38 Ok(None)
40 }
41}
42
43#[napi]
45pub struct HyperedgeStream {
46 results: Vec<JsHyperedgeResult>,
47 index: usize,
48}
49
50impl HyperedgeStream {
51 pub fn new(results: Vec<JsHyperedgeResult>) -> Self {
53 Self { results, index: 0 }
54 }
55}
56
57#[napi]
58impl HyperedgeStream {
59 #[napi]
69 pub fn next(&mut self) -> Result<Option<JsHyperedgeResult>> {
70 if self.index < self.results.len() {
71 let result = self.results[self.index].clone();
72 self.index += 1;
73 Ok(Some(result))
74 } else {
75 Ok(None)
76 }
77 }
78
79 #[napi]
81 pub fn collect(&mut self) -> Vec<JsHyperedgeResult> {
82 let remaining = self.results[self.index..].to_vec();
83 self.index = self.results.len();
84 remaining
85 }
86}
87
88#[napi]
90pub struct NodeStream {
91 nodes: Vec<JsNode>,
92 index: usize,
93}
94
95impl NodeStream {
96 pub fn new(nodes: Vec<JsNode>) -> Self {
98 Self { nodes, index: 0 }
99 }
100}
101
102#[napi]
103impl NodeStream {
104 #[napi]
106 pub fn next(&mut self) -> Result<Option<JsNode>> {
107 if self.index < self.nodes.len() {
108 let node = self.nodes[self.index].clone();
109 self.index += 1;
110 Ok(Some(node))
111 } else {
112 Ok(None)
113 }
114 }
115
116 #[napi]
118 pub fn collect(&mut self) -> Vec<JsNode> {
119 let remaining = self.nodes[self.index..].to_vec();
120 self.index = self.nodes.len();
121 remaining
122 }
123}