use crate::types::*;
use futures::stream::Stream;
use napi::bindgen_prelude::*;
use napi_derive::napi;
use std::pin::Pin;
use std::task::{Context, Poll};
#[napi]
pub struct QueryResultStream {
inner: Pin<Box<dyn Stream<Item = JsQueryResult> + Send>>,
}
impl QueryResultStream {
pub fn new(stream: Pin<Box<dyn Stream<Item = JsQueryResult> + Send>>) -> Self {
Self { inner: stream }
}
}
#[napi]
impl QueryResultStream {
#[napi]
pub fn next(&mut self) -> Result<Option<JsQueryResult>> {
Ok(None)
}
}
#[napi]
pub struct HyperedgeStream {
results: Vec<JsHyperedgeResult>,
index: usize,
}
impl HyperedgeStream {
pub fn new(results: Vec<JsHyperedgeResult>) -> Self {
Self { results, index: 0 }
}
}
#[napi]
impl HyperedgeStream {
#[napi]
pub fn next(&mut self) -> Result<Option<JsHyperedgeResult>> {
if self.index < self.results.len() {
let result = self.results[self.index].clone();
self.index += 1;
Ok(Some(result))
} else {
Ok(None)
}
}
#[napi]
pub fn collect(&mut self) -> Vec<JsHyperedgeResult> {
let remaining = self.results[self.index..].to_vec();
self.index = self.results.len();
remaining
}
}
#[napi]
pub struct NodeStream {
nodes: Vec<JsNode>,
index: usize,
}
impl NodeStream {
pub fn new(nodes: Vec<JsNode>) -> Self {
Self { nodes, index: 0 }
}
}
#[napi]
impl NodeStream {
#[napi]
pub fn next(&mut self) -> Result<Option<JsNode>> {
if self.index < self.nodes.len() {
let node = self.nodes[self.index].clone();
self.index += 1;
Ok(Some(node))
} else {
Ok(None)
}
}
#[napi]
pub fn collect(&mut self) -> Vec<JsNode> {
let remaining = self.nodes[self.index..].to_vec();
self.index = self.nodes.len();
remaining
}
}