// Requires the updated native development runtime with research syntax support.
// Complete local example: defaults, outcome inference/propagation and checked indexing.
import aner.math

fn scale(value: Float64, factor: Float64 = 2.0) -> Float64 {
    return value * factor
}
fn positive_root(value: Float64) -> Result<Float64, String> {
    if value < 0.0 { return Result.err("value must be nonnegative") }
    return Result.ok(math.sqrt(value))
}
fn labeled_root(value: Float64) -> Result<String, String> {
    let root = positive_root(value)?
    return Result.ok("root=" + String(root))
}

let missing: Optional<Float64> = Optional.none()
let nested: Result<Optional<Int64>, String> = Result.ok(Optional.none())
let readings = Array<Float64>(size: 3, fill: 0.0)
readings[0] = 3.0
readings[1] = 4.0
var squares = 0.0
for index in Range(readings.len()) {
    squares += math.pow(readings[index], 2.0)
}
let matrix = NDArray<Float64>(shape: List(2, 2), fill: 0.0)
matrix[1, 1] = math.sqrt(squares)
matrix[1, 1] += 1.0
var count = 3
count *= 4
count /= 2
count -= 1

print(scale(3.0))
print(scale(factor: 4.0, value: 3.0))
print(missing.is_none())
print(nested.unwrap().is_none())
print(matrix[1, 1])
print(count)
print(labeled_root(25.0).unwrap())
print(labeled_root(-1.0).unwrap_err())
