round_pipers 0.2.0

A way to pipe ndarrays using circular buffers
Documentation
use ndarray::Ix0;
use round_pipers::Result;
use round_pipers::{Writable, WriteOnlyPipeStream};
use std::io::Cursor;

fn main() -> Result<()> {
    // Create a stream that writes to a Vec<u8> via Cursor
    let buffer = Vec::new();
    let cursor = Cursor::new(buffer);

    let pipe = WriteOnlyPipeStream::<_, f64, Ix0, String>::new(cursor, 10, [])?;

    // Set some metadata
    pipe.set_metadata("Example stream data".to_string());

    // Write some data - buffer will grow as needed
    pipe.write(5, |mut chunk, _state| {
        for (i, value) in chunk.iter_mut().enumerate() {
            *value = (i as f64) * 3.14;
        }
        println!("Wrote 5 f64 values to stream");
    })?;

    // Write more data - buffer grows automatically
    pipe.write(15, |mut chunk, _state| {
        for (i, value) in chunk.iter_mut().enumerate() {
            *value = (i as f64) + 100.0;
        }
        println!("Wrote 15 more f64 values to stream");
    })?;

    // Verify the metadata persisted
    println!("Metadata: {:?}", pipe.get_metadata());

    // Get the final cursor and data
    let final_cursor = pipe.into_writer();
    let final_data = final_cursor.into_inner();

    println!("Total bytes written: {}", final_data.len());
    println!("Expected: {} bytes", (5 + 15) * 8); // 20 f64s = 160 bytes

    Ok(())
}