fn bytesTail(bytes: Span<u8>) -> Span<u8> {
    return bytes[2..]
}

fn bytesPrefix(bytes: Span<u8>) -> Span<u8> {
    return bytes[..3]
}

fn intWhole(values: Span<i32>) -> Span<i32> {
    return values[..]
}

fn intTail(values: Span<i32>) -> Span<i32> {
    return values[2..]
}

pub fn main(world: World) -> Void raises {
    let bytes: [5]u8 = [65, 66, 67, 68, 69]
    let bytesSpan: Span<u8> = std.mem.span("ABCDE")
    let tail: Span<u8> = bytes[2..]
    let prefix: Span<u8> = bytesSpan[..3]
    let whole: Span<u8> = bytesSpan[..]
    let values: [5]i32 = [10, 20, 30, 40, 50]
    let numbers: Span<i32> = values
    let intPrefix: Span<i32> = values[..3]
    let intTailView: Span<i32> = numbers[2..]
    let intWholeView: Span<i32> = numbers[..]
    if std.mem.len(tail) == 3 && tail[0] == 67 && tail[2] == 69 && std.mem.len(prefix) == 3 && prefix[2] == 67 && std.mem.len(whole) == 5 && whole[4] == 69 && bytesTail(bytesSpan)[1] == 68 && bytesPrefix(bytesSpan)[0] == 65 && intPrefix[2] == 30 && intTailView[0] == 30 && intTailView[2] == 50 && intWholeView[4] == 50 && intWhole(numbers)[3] == 40 && intTail(numbers)[1] == 40 {
        check world.out.write("open ended slices ok\n")
    }
}
