use erased_cells::{BufferOps, CellBuffer, CellType, CellValue};

fn main() {
    // Fill a buffer with the `u8` numbers `0..=8`.
    let buf1 = CellBuffer::fill_via(9, |i| i as u8);

    // `u8` maps to `CellType::UInt8`
    assert_eq!(buf1.cell_type(), CellType::UInt8);

    // A fetching values maintains its CellType through a CellValue.
    let val: CellValue = buf1.get(3);
    assert_eq!(val, CellValue::UInt8(3));
    let (min, max): (CellValue, CellValue) = buf1.min_max();
    assert_eq!((min, max), (CellValue::UInt8(0), CellValue::UInt8(8)));

    // Basic math ops work on CellValues. Primitives can be converted to CellValues with `into`.
    // Math ops coerce to floating point values.
    assert_eq!(((max - min + 1) / 2), 4.5.into());

    // Fill another buffer with the `f32` numbers `8..=0`.
    let buf2 = CellBuffer::fill_via(9, |i| 8f32 - i as f32);
    assert_eq!(buf2.cell_type(), CellType::Float32);
    assert_eq!(
        buf2.min_max(),
        (CellValue::Float32(0.0), CellValue::Float32(8.0))
    );

    // Basic math ops also work on CellBuffers, applied element-wise.
    let diff = buf2 - buf1;
    assert_eq!(diff.min_max(), ((-8).into(), 8.into()));
}
