type Span[T] = object data: ptr T length: int func newSpan[T](data: ptr T, length: int): Span = return Span[T](data, length) template `len`[T](span: Span): int = span.length func `[]`[T](span: Span[T]; idx: SomeInteger): T = when not defined(danger): if(idx < 0 or idx >= span.length): raise newException(IndexDefect, "Index not in 0.." & (span.length - 1)) return span.data[idx] proc `[]=`[T](span: Span[T]; idx: SomeInteger, value: T) = when not defined(danger): if(idx < 0 or idx >= span.length): raise newException(IndexDefect, "Index not in 0.." & (span.length - 1)) span.data[idx] = T # Way better