forked from extern/nushell
93e8f6c05e
We split off the evaluation engine part of nu-cli into its own crate. This helps improve build times for nu-cli by 17% in my tests. It also helps us see a bit better what's the core engine portion vs the part specific to the interactive CLI piece. There's more than can be done here, but I think it's a good start in the right direction.
49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
use crate::prelude::*;
|
|
use futures::task::Poll;
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
pub struct InterruptibleStream<V> {
|
|
inner: BoxStream<'static, V>,
|
|
interrupt_signal: Arc<AtomicBool>,
|
|
}
|
|
|
|
impl<V> InterruptibleStream<V> {
|
|
pub fn new<S>(inner: S, interrupt_signal: Arc<AtomicBool>) -> InterruptibleStream<V>
|
|
where
|
|
S: Stream<Item = V> + Send + 'static,
|
|
{
|
|
InterruptibleStream {
|
|
inner: inner.boxed(),
|
|
interrupt_signal,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<V> Stream for InterruptibleStream<V> {
|
|
type Item = V;
|
|
|
|
fn poll_next(
|
|
mut self: std::pin::Pin<&mut Self>,
|
|
cx: &mut std::task::Context<'_>,
|
|
) -> core::task::Poll<Option<Self::Item>> {
|
|
if self.interrupt_signal.load(Ordering::SeqCst) {
|
|
Poll::Ready(None)
|
|
} else {
|
|
Stream::poll_next(std::pin::Pin::new(&mut self.inner), cx)
|
|
}
|
|
}
|
|
}
|
|
|
|
pub trait Interruptible<V> {
|
|
fn interruptible(self, ctrl_c: Arc<AtomicBool>) -> InterruptibleStream<V>;
|
|
}
|
|
|
|
impl<S, V> Interruptible<V> for S
|
|
where
|
|
S: Stream<Item = V> + Send + 'static,
|
|
{
|
|
fn interruptible(self, ctrl_c: Arc<AtomicBool>) -> InterruptibleStream<V> {
|
|
InterruptibleStream::new(self, ctrl_c)
|
|
}
|
|
}
|