WIP typechecks
This commit is contained in:
@@ -85,7 +85,7 @@ fn make_test_channel_events_stream_data_inner(
|
||||
debug!("use test backend data");
|
||||
let chn = subq.name();
|
||||
let range = subq.range().clone();
|
||||
let one_before = subq.transform().need_one_before_range();
|
||||
let one_before = subq.need_one_before_range();
|
||||
if chn == "test-gen-i32-dim0-v00" {
|
||||
Ok(Box::pin(GenerateI32V00::new(node_ix, node_count, range, one_before)))
|
||||
} else if chn == "test-gen-i32-dim0-v01" {
|
||||
|
||||
@@ -39,7 +39,7 @@ where
|
||||
inp: S,
|
||||
range: NanoRange,
|
||||
range_str: String,
|
||||
one_before_range: bool,
|
||||
one_before: bool,
|
||||
stats: RangeFilterStats,
|
||||
slot1: Option<ITY>,
|
||||
have_range_complete: bool,
|
||||
@@ -59,20 +59,20 @@ where
|
||||
std::any::type_name::<Self>()
|
||||
}
|
||||
|
||||
pub fn new(inp: S, range: NanoRange, one_before_range: bool) -> Self {
|
||||
pub fn new(inp: S, range: NanoRange, one_before: bool) -> Self {
|
||||
let trdet = false;
|
||||
trace_emit!(
|
||||
trdet,
|
||||
"{}::new range: {:?} one_before_range {:?}",
|
||||
"{}::new range: {:?} one_before {:?}",
|
||||
Self::type_name(),
|
||||
range,
|
||||
one_before_range
|
||||
one_before
|
||||
);
|
||||
Self {
|
||||
inp,
|
||||
range_str: format!("{:?}", range),
|
||||
range,
|
||||
one_before_range,
|
||||
one_before,
|
||||
stats: RangeFilterStats::new(),
|
||||
slot1: None,
|
||||
have_range_complete: false,
|
||||
@@ -116,6 +116,11 @@ where
|
||||
}
|
||||
|
||||
fn handle_item(&mut self, item: ITY) -> Result<ITY, Error> {
|
||||
if let Some(ts_min) = item.ts_min() {
|
||||
if ts_min < self.range.beg() {
|
||||
debug!("ITEM BEFORE RANGE (how many?)");
|
||||
}
|
||||
}
|
||||
let min = item.ts_min().map(|x| TsNano::from_ns(x).fmt());
|
||||
let max = item.ts_max().map(|x| TsNano::from_ns(x).fmt());
|
||||
trace_emit!(
|
||||
@@ -126,7 +131,7 @@ where
|
||||
max
|
||||
);
|
||||
let mut item = self.prune_high(item, self.range.end)?;
|
||||
let ret = if self.one_before_range {
|
||||
let ret = if self.one_before {
|
||||
let lige = item.find_lowest_index_ge(self.range.beg);
|
||||
trace_emit!(self.trdet, "YES one_before_range ilge {:?}", lige);
|
||||
match lige {
|
||||
|
||||
@@ -5,8 +5,7 @@ use futures_util::FutureExt;
|
||||
use futures_util::Stream;
|
||||
use futures_util::StreamExt;
|
||||
use items_0::streamitem::Sitemty;
|
||||
use items_0::timebin::TimeBinnable;
|
||||
use items_2::binsdim0::BinsDim0;
|
||||
use items_0::timebin::BinsBoxed;
|
||||
use items_2::channelevents::ChannelEvents;
|
||||
use netpod::log::*;
|
||||
use netpod::BinnedRange;
|
||||
@@ -55,19 +54,19 @@ pub trait EventsReadProvider: Send + Sync {
|
||||
}
|
||||
|
||||
pub struct CacheReading {
|
||||
fut: Pin<Box<dyn Future<Output = Result<BinsDim0<f32>, streams::timebin::cached::reader::Error>> + Send>>,
|
||||
fut: Pin<Box<dyn Future<Output = Result<BinsBoxed, streams::timebin::cached::reader::Error>> + Send>>,
|
||||
}
|
||||
|
||||
impl CacheReading {
|
||||
pub fn new(
|
||||
fut: Pin<Box<dyn Future<Output = Result<BinsDim0<f32>, streams::timebin::cached::reader::Error>> + Send>>,
|
||||
fut: Pin<Box<dyn Future<Output = Result<BinsBoxed, streams::timebin::cached::reader::Error>> + Send>>,
|
||||
) -> Self {
|
||||
Self { fut }
|
||||
}
|
||||
}
|
||||
|
||||
impl Future for CacheReading {
|
||||
type Output = Result<BinsDim0<f32>, streams::timebin::cached::reader::Error>;
|
||||
type Output = Result<BinsBoxed, streams::timebin::cached::reader::Error>;
|
||||
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
|
||||
self.fut.poll_unpin(cx)
|
||||
@@ -94,7 +93,7 @@ impl Future for CacheWriting {
|
||||
|
||||
pub trait CacheReadProvider: Send + Sync {
|
||||
fn read(&self, series: u64, bin_len: DtMs, msp: u64, offs: Range<u32>) -> CacheReading;
|
||||
fn write(&self, series: u64, bins: BinsDim0<f32>) -> CacheWriting;
|
||||
fn write(&self, series: u64, bins: BinsBoxed) -> CacheWriting;
|
||||
}
|
||||
|
||||
#[derive(Debug, ThisError)]
|
||||
@@ -112,7 +111,7 @@ pub struct CachedReader {
|
||||
ts1next: TsNano,
|
||||
bin_len: DtMs,
|
||||
cache_read_provider: Arc<dyn CacheReadProvider>,
|
||||
reading: Option<Pin<Box<dyn Future<Output = Result<BinsDim0<f32>, Error>> + Send>>>,
|
||||
reading: Option<Pin<Box<dyn Future<Output = Result<BinsBoxed, Error>> + Send>>>,
|
||||
}
|
||||
|
||||
impl CachedReader {
|
||||
@@ -134,7 +133,7 @@ impl CachedReader {
|
||||
}
|
||||
|
||||
impl Stream for CachedReader {
|
||||
type Item = Result<BinsDim0<f32>, Error>;
|
||||
type Item = Result<BinsBoxed, Error>;
|
||||
|
||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
|
||||
use Poll::*;
|
||||
@@ -151,7 +150,6 @@ impl Stream for CachedReader {
|
||||
self.reading = None;
|
||||
match x {
|
||||
Ok(bins) => {
|
||||
use items_0::WithLen;
|
||||
trace_emit!(
|
||||
"- - - - - - - - - - - - emit cached bins {} bin_len {}",
|
||||
bins.len(),
|
||||
|
||||
@@ -6,8 +6,7 @@ use futures_util::StreamExt;
|
||||
use items_0::streamitem::RangeCompletableItem;
|
||||
use items_0::streamitem::Sitemty;
|
||||
use items_0::streamitem::StreamItem;
|
||||
use items_2::binsdim0::BinsDim0;
|
||||
use items_2::channelevents::ChannelEvents;
|
||||
use items_0::timebin::BinsBoxed;
|
||||
use netpod::log::*;
|
||||
use netpod::BinnedRange;
|
||||
use netpod::ChConf;
|
||||
@@ -26,7 +25,7 @@ macro_rules! trace_emit { ($($arg:tt)*) => ( if true { trace!($($arg)*); } ) }
|
||||
pub enum Error {}
|
||||
|
||||
pub struct BinnedFromEvents {
|
||||
stream: Pin<Box<dyn Stream<Item = Sitemty<BinsDim0<f32>>> + Send>>,
|
||||
stream: Pin<Box<dyn Stream<Item = Sitemty<BinsBoxed>> + Send>>,
|
||||
}
|
||||
|
||||
impl BinnedFromEvents {
|
||||
@@ -41,33 +40,28 @@ impl BinnedFromEvents {
|
||||
panic!();
|
||||
}
|
||||
let stream = read_provider.read(evq, chconf);
|
||||
let stream = stream.map(|x| {
|
||||
let x = items_0::try_map_sitemty_data!(x, |x| match x {
|
||||
ChannelEvents::Events(x) => {
|
||||
let x = x.to_dim0_f32_for_binning();
|
||||
Ok(ChannelEvents::Events(x))
|
||||
}
|
||||
ChannelEvents::Status(x) => Ok(ChannelEvents::Status(x)),
|
||||
});
|
||||
x
|
||||
});
|
||||
let stream = Box::pin(stream);
|
||||
let stream = super::basic::TimeBinnedStream::new(stream, netpod::BinnedRangeEnum::Time(range), do_time_weight);
|
||||
// let stream = stream.map(|x| {
|
||||
// let x = items_0::try_map_sitemty_data!(x, |x| match x {
|
||||
// ChannelEvents::Events(x) => {
|
||||
// let x = x.to_dim0_f32_for_binning();
|
||||
// Ok(ChannelEvents::Events(x))
|
||||
// }
|
||||
// ChannelEvents::Status(x) => Ok(ChannelEvents::Status(x)),
|
||||
// });
|
||||
// x
|
||||
// });
|
||||
let stream = if do_time_weight {
|
||||
let stream = Box::pin(stream);
|
||||
items_2::binning::timeweight::timeweight_events_dyn::BinnedEventsTimeweightStream::new(range, stream)
|
||||
} else {
|
||||
panic!("non-weighted TODO")
|
||||
};
|
||||
let stream = stream.map(|item| match item {
|
||||
Ok(x) => match x {
|
||||
StreamItem::DataItem(x) => match x {
|
||||
RangeCompletableItem::Data(mut x) => {
|
||||
// TODO need a typed time binner
|
||||
if let Some(x) = x.as_any_mut().downcast_mut::<BinsDim0<f32>>() {
|
||||
let y = x.clone();
|
||||
use items_0::WithLen;
|
||||
trace_emit!("=========== ========= emit from events {}", y.len());
|
||||
Ok(StreamItem::DataItem(RangeCompletableItem::Data(y)))
|
||||
} else {
|
||||
Err(::err::Error::with_msg_no_trace(
|
||||
"GapFill expects incoming BinsDim0<f32>",
|
||||
))
|
||||
}
|
||||
RangeCompletableItem::Data(x) => {
|
||||
debug!("see item {:?}", x);
|
||||
Ok(StreamItem::DataItem(RangeCompletableItem::Data(x)))
|
||||
}
|
||||
RangeCompletableItem::RangeComplete => {
|
||||
info!("BinnedFromEvents sees range final");
|
||||
@@ -87,7 +81,7 @@ impl BinnedFromEvents {
|
||||
}
|
||||
|
||||
impl Stream for BinnedFromEvents {
|
||||
type Item = Sitemty<BinsDim0<f32>>;
|
||||
type Item = Sitemty<BinsBoxed>;
|
||||
|
||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
|
||||
self.stream.poll_next_unpin(cx)
|
||||
|
||||
@@ -12,7 +12,10 @@ use items_0::on_sitemty_data;
|
||||
use items_0::streamitem::RangeCompletableItem;
|
||||
use items_0::streamitem::Sitemty;
|
||||
use items_0::streamitem::StreamItem;
|
||||
use items_0::timebin::BinningggContainerBinsDyn;
|
||||
use items_0::timebin::BinsBoxed;
|
||||
use items_0::timebin::TimeBinnableTy;
|
||||
use items_2::binning::timeweight::timeweight_bins_dyn::BinnedBinsTimeweightStream;
|
||||
use items_2::binsdim0::BinsDim0;
|
||||
use netpod::log::*;
|
||||
use netpod::query::CacheUsage;
|
||||
@@ -44,7 +47,7 @@ pub enum Error {
|
||||
FinerGridMismatch(DtMs, DtMs),
|
||||
}
|
||||
|
||||
type BoxedInput = Pin<Box<dyn Stream<Item = Sitemty<BinsDim0<f32>>> + Send>>;
|
||||
type BoxedInput = Pin<Box<dyn Stream<Item = Sitemty<BinsBoxed>> + Send>>;
|
||||
|
||||
pub struct TimeBinnedFromLayers {
|
||||
ch_conf: ChannelTypeConfigGen,
|
||||
@@ -141,11 +144,7 @@ impl TimeBinnedFromLayers {
|
||||
cache_read_provider,
|
||||
events_read_provider.clone(),
|
||||
)?;
|
||||
let inp = super::basic::TimeBinnedStream::new(
|
||||
Box::pin(inp),
|
||||
BinnedRangeEnum::Time(range),
|
||||
do_time_weight,
|
||||
);
|
||||
let inp = BinnedBinsTimeweightStream::new(range, Box::pin(inp));
|
||||
let ret = Self {
|
||||
ch_conf,
|
||||
cache_usage,
|
||||
@@ -200,7 +199,7 @@ impl TimeBinnedFromLayers {
|
||||
}
|
||||
|
||||
impl Stream for TimeBinnedFromLayers {
|
||||
type Item = Sitemty<BinsDim0<f32>>;
|
||||
type Item = Sitemty<BinsBoxed>;
|
||||
|
||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
|
||||
use Poll::*;
|
||||
|
||||
@@ -9,9 +9,7 @@ use futures_util::StreamExt;
|
||||
use items_0::streamitem::RangeCompletableItem;
|
||||
use items_0::streamitem::Sitemty;
|
||||
use items_0::streamitem::StreamItem;
|
||||
use items_0::Empty;
|
||||
use items_0::WithLen;
|
||||
use items_2::binsdim0::BinsDim0;
|
||||
use items_0::timebin::BinsBoxed;
|
||||
use netpod::log::*;
|
||||
use netpod::query::CacheUsage;
|
||||
use netpod::range::evrange::NanoRange;
|
||||
@@ -56,7 +54,7 @@ pub enum Error {
|
||||
EventsReader(#[from] super::fromevents::Error),
|
||||
}
|
||||
|
||||
type INP = Pin<Box<dyn Stream<Item = Sitemty<BinsDim0<f32>>> + Send>>;
|
||||
type Input = Pin<Box<dyn Stream<Item = Sitemty<BinsBoxed>> + Send>>;
|
||||
|
||||
// Try to read from cache for the given bin len.
|
||||
// For gaps in the stream, construct an alternative input from finer bin len with a binner.
|
||||
@@ -72,10 +70,10 @@ pub struct GapFill {
|
||||
range: BinnedRange<TsNano>,
|
||||
do_time_weight: bool,
|
||||
bin_len_layers: Vec<DtMs>,
|
||||
inp: Option<INP>,
|
||||
inp: Option<Input>,
|
||||
inp_range_final: bool,
|
||||
inp_buf: Option<BinsDim0<f32>>,
|
||||
inp_finer: Option<INP>,
|
||||
inp_buf: Option<BinsBoxed>,
|
||||
inp_finer: Option<Input>,
|
||||
inp_finer_range_final: bool,
|
||||
inp_finer_range_final_cnt: u32,
|
||||
inp_finer_range_final_max: u32,
|
||||
@@ -84,7 +82,7 @@ pub struct GapFill {
|
||||
exp_finer_range: NanoRange,
|
||||
cache_read_provider: Arc<dyn CacheReadProvider>,
|
||||
events_read_provider: Arc<dyn EventsReadProvider>,
|
||||
bins_for_cache_write: BinsDim0<f32>,
|
||||
bins_for_cache_write: Option<BinsBoxed>,
|
||||
done: bool,
|
||||
cache_writing: Option<super::cached::reader::CacheWriting>,
|
||||
}
|
||||
@@ -114,7 +112,7 @@ impl GapFill {
|
||||
Ok(x) => Ok(StreamItem::DataItem(RangeCompletableItem::Data(x))),
|
||||
Err(e) => Err(::err::Error::from_string(e)),
|
||||
});
|
||||
Box::pin(stream) as Pin<Box<dyn Stream<Item = Sitemty<BinsDim0<f32>>> + Send>>
|
||||
Box::pin(stream) as Pin<Box<dyn Stream<Item = Sitemty<BinsBoxed>> + Send>>
|
||||
} else {
|
||||
let stream = futures_util::stream::empty();
|
||||
Box::pin(stream)
|
||||
@@ -144,36 +142,33 @@ impl GapFill {
|
||||
exp_finer_range: NanoRange { beg: 0, end: 0 },
|
||||
cache_read_provider,
|
||||
events_read_provider,
|
||||
bins_for_cache_write: BinsDim0::empty(),
|
||||
bins_for_cache_write: None,
|
||||
done: false,
|
||||
cache_writing: None,
|
||||
};
|
||||
Ok(ret)
|
||||
}
|
||||
|
||||
fn handle_bins_finer(mut self: Pin<&mut Self>, bins: BinsDim0<f32>) -> Result<BinsDim0<f32>, Error> {
|
||||
fn handle_bins_finer(mut self: Pin<&mut Self>, bins: BinsBoxed) -> Result<BinsBoxed, Error> {
|
||||
trace_handle!("{} handle_bins_finer {}", self.dbgname, bins);
|
||||
for (&ts1, &ts2) in bins.ts1s.iter().zip(&bins.ts2s) {
|
||||
for (&ts1, &ts2) in bins.edges_iter() {
|
||||
if let Some(last) = self.last_bin_ts2 {
|
||||
if ts1 != last.ns() {
|
||||
return Err(Error::GapFromFiner(
|
||||
TsNano::from_ns(ts1),
|
||||
last,
|
||||
self.range.bin_len_dt_ms(),
|
||||
));
|
||||
if ts1 != last {
|
||||
return Err(Error::GapFromFiner(ts1, last, self.range.bin_len_dt_ms()));
|
||||
}
|
||||
} else if ts1 != self.range.nano_beg().ns() {
|
||||
} else if ts1 != self.range.nano_beg() {
|
||||
return Err(Error::MissingBegFromFiner(
|
||||
TsNano::from_ns(ts1),
|
||||
ts1,
|
||||
self.range.nano_beg(),
|
||||
self.range.bin_len_dt_ms(),
|
||||
));
|
||||
}
|
||||
self.last_bin_ts2 = Some(TsNano::from_ns(ts2));
|
||||
self.last_bin_ts2 = Some(ts2);
|
||||
}
|
||||
if bins.len() != 0 {
|
||||
let mut bins2 = bins.clone();
|
||||
bins2.drain_into(&mut self.bins_for_cache_write, 0..bins2.len());
|
||||
let dst = self.bins_for_cache_write.get_or_insert_with(|| bins.empty());
|
||||
bins2.drain_into(dst.as_mut(), 0..bins2.len());
|
||||
}
|
||||
if self.cache_usage.is_cache_write() {
|
||||
self.cache_write_intermediate()?;
|
||||
@@ -191,34 +186,34 @@ impl GapFill {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_bins(mut self: Pin<&mut Self>, bins: BinsDim0<f32>) -> Result<BinsDim0<f32>, Error> {
|
||||
fn handle_bins(mut self: Pin<&mut Self>, bins: BinsBoxed) -> Result<BinsBoxed, Error> {
|
||||
trace_handle!("{} handle_bins {}", self.dbgname, bins);
|
||||
// TODO could use an interface to iterate over opaque bin items that only expose
|
||||
// edge and count information with all remaining values opaque.
|
||||
for (i, (&ts1, &ts2)) in bins.ts1s.iter().zip(&bins.ts2s).enumerate() {
|
||||
if ts1 < self.range.nano_beg().ns() {
|
||||
for (i, (&ts1, &ts2)) in bins.edges_iter().enumerate() {
|
||||
if ts1 < self.range.nano_beg() {
|
||||
return Err(Error::InputBeforeRange(
|
||||
NanoRange::from_ns_u64(ts1, ts2),
|
||||
NanoRange::from_ns_u64(ts1.ns(), ts2.ns()),
|
||||
self.range.clone(),
|
||||
));
|
||||
}
|
||||
if let Some(last) = self.last_bin_ts2 {
|
||||
if ts1 != last.ns() {
|
||||
if ts1 != last {
|
||||
trace_handle!("{} detect a gap BETWEEN last {} ts1 {}", self.dbgname, last, ts1);
|
||||
let mut ret = <BinsDim0<f32> as items_0::Empty>::empty();
|
||||
let mut ret = bins.empty();
|
||||
let mut bins = bins;
|
||||
bins.drain_into(&mut ret, 0..i);
|
||||
bins.drain_into(ret.as_mut(), 0..i);
|
||||
self.inp_buf = Some(bins);
|
||||
let range = NanoRange {
|
||||
beg: last.ns(),
|
||||
end: ts1,
|
||||
end: ts1.ns(),
|
||||
};
|
||||
self.setup_sub(range)?;
|
||||
return Ok(ret);
|
||||
} else {
|
||||
// nothing to do
|
||||
}
|
||||
} else if ts1 != self.range.nano_beg().ns() {
|
||||
} else if ts1 != self.range.nano_beg() {
|
||||
trace_handle!(
|
||||
"{} detect a gap BEGIN beg {} ts1 {}",
|
||||
self.dbgname,
|
||||
@@ -227,12 +222,12 @@ impl GapFill {
|
||||
);
|
||||
let range = NanoRange {
|
||||
beg: self.range.nano_beg().ns(),
|
||||
end: ts1,
|
||||
end: ts1.ns(),
|
||||
};
|
||||
self.setup_sub(range)?;
|
||||
return Ok(BinsDim0::empty());
|
||||
return Ok(bins.empty());
|
||||
}
|
||||
self.last_bin_ts2 = Some(TsNano::from_ns(ts2));
|
||||
self.last_bin_ts2 = Some(ts2);
|
||||
}
|
||||
Ok(bins)
|
||||
}
|
||||
@@ -270,10 +265,12 @@ impl GapFill {
|
||||
self.events_read_provider.clone(),
|
||||
)?;
|
||||
let stream = Box::pin(inp_finer);
|
||||
let do_time_weight = self.do_time_weight;
|
||||
let range = BinnedRange::from_nano_range(range_finer.full_range(), self.range.bin_len.to_dt_ms());
|
||||
let stream =
|
||||
super::basic::TimeBinnedStream::new(stream, netpod::BinnedRangeEnum::Time(range), do_time_weight);
|
||||
let stream = if self.do_time_weight {
|
||||
::items_2::binning::timeweight::timeweight_bins_dyn::BinnedBinsTimeweightStream::new(range, stream)
|
||||
} else {
|
||||
panic!("TODO unweighted")
|
||||
};
|
||||
self.inp_finer = Some(Box::pin(stream));
|
||||
} else {
|
||||
debug_setup!("{} setup_inp_finer next finer from events {}", self.dbgname, range);
|
||||
@@ -309,7 +306,7 @@ impl GapFill {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn cache_write(mut self: Pin<&mut Self>, bins: BinsDim0<f32>) -> Result<(), Error> {
|
||||
fn cache_write(mut self: Pin<&mut Self>, bins: BinsBoxed) -> Result<(), Error> {
|
||||
self.cache_writing = Some(self.cache_read_provider.write(self.series, bins));
|
||||
Ok(())
|
||||
}
|
||||
@@ -318,42 +315,27 @@ impl GapFill {
|
||||
if self.inp_finer_fills_gap {
|
||||
// TODO can consider all incoming bins as final by assumption.
|
||||
}
|
||||
let aa = &self.bins_for_cache_write;
|
||||
if aa.len() >= 2 {
|
||||
for (i, (&c1, &_c2)) in aa.cnts.iter().rev().zip(aa.cnts.iter().rev().skip(1)).enumerate() {
|
||||
if c1 != 0 {
|
||||
let n = aa.len() - (1 + i);
|
||||
debug_cache!("{} cache_write_on_end consider {} for write", self.dbgname, n);
|
||||
let mut bins_write = BinsDim0::empty();
|
||||
self.bins_for_cache_write.drain_into(&mut bins_write, 0..n);
|
||||
self.cache_write(bins_write)?;
|
||||
break;
|
||||
}
|
||||
if let Some(bins) = &self.bins_for_cache_write {
|
||||
if bins.len() >= 2 {
|
||||
// TODO guard behind flag.
|
||||
// TODO emit to a async user-given channel, if given.
|
||||
// Therefore, move to poll loop.
|
||||
// Should only write to cache with non-zero count, therefore, not even emit others?
|
||||
// TODO afterwards set to None.
|
||||
self.bins_for_cache_write = None;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn cache_write_intermediate(mut self: Pin<&mut Self>) -> Result<(), Error> {
|
||||
let aa = &self.bins_for_cache_write;
|
||||
if aa.len() >= 2 {
|
||||
for (i, (&c1, &_c2)) in aa.cnts.iter().rev().zip(aa.cnts.iter().rev().skip(1)).enumerate() {
|
||||
if c1 != 0 {
|
||||
let n = aa.len() - (1 + i);
|
||||
debug_cache!("{} cache_write_intermediate consider {} for write", self.dbgname, n);
|
||||
let mut bins_write = BinsDim0::empty();
|
||||
self.bins_for_cache_write.drain_into(&mut bins_write, 0..n);
|
||||
self.cache_write(bins_write)?;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
fn cache_write_intermediate(self: Pin<&mut Self>) -> Result<(), Error> {
|
||||
// TODO See cache_write_on_end
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Stream for GapFill {
|
||||
type Item = Sitemty<BinsDim0<f32>>;
|
||||
type Item = Sitemty<BinsBoxed>;
|
||||
|
||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
|
||||
use Poll::*;
|
||||
|
||||
@@ -361,9 +361,9 @@ async fn timebinned_stream(
|
||||
)
|
||||
.map_err(Error::from_string)?;
|
||||
let stream = stream.map(|item| {
|
||||
on_sitemty_data!(item, |k| Ok(StreamItem::DataItem(RangeCompletableItem::Data(
|
||||
Box::new(k) as Box<dyn TimeBinned>
|
||||
))))
|
||||
on_sitemty_data!(item, |k: items_0::timebin::BinsBoxed| Ok(StreamItem::DataItem(
|
||||
RangeCompletableItem::Data(k.to_old_time_binned())
|
||||
)))
|
||||
});
|
||||
let stream: Pin<Box<dyn Stream<Item = Sitemty<Box<dyn TimeBinned>>> + Send>> = Box::pin(stream);
|
||||
Ok(stream)
|
||||
|
||||
Reference in New Issue
Block a user