///|
pub fn Tensor::crop(
  self : Tensor,
  start : Array[Int32],
  sizes : Array[Int32],
  limits~ : Limits = Limits::default(),
) -> Tensor raise NrrdError {
  if start.length() != self.shape.dimension() ||
    sizes.length() != self.shape.dimension() {
    raise Invalid("crop dimension")
  }
  let shape = Shape::new(sizes, limits~)
  for axis, first in start {
    if first < 0 ||
      first >= self.shape.axes[axis] ||
      sizes[axis] > self.shape.axes[axis] - first {
      raise Invalid("crop outside raster")
    }
  }
  ignore(shape.byte_count(self.scalar, limits))
  let values = Array::make(shape.count, 0.0)
  for i in 0.. Tensor raise NrrdError {
  check_axis(self.shape, axis)
  if self.shape.dimension() == 1 {
    raise Unsupported("zero-dimensional output")
  }
  if position < 0 || position >= self.shape.axes[axis] {
    raise Invalid("slice position")
  }
  let axes = []
  for a in 0..