// Complete local experiment: explicit source units, typed observations and checked rates.
// Requires the updated native Aner development runtime with aner.units.
import aner.units

class Observation {
    public let travel: Quantity<m>
    public let elapsed: Quantity<s>
    public let temperature: Point<degC>
}
fn speed(observation: Observation) -> Result<Quantity<"m/s">, String> {
    if observation.elapsed <= 0.0@s { return Result.err("elapsed time must be positive") }
    return Result.ok(observation.travel / observation.elapsed)
}
fn report(observation: Observation) -> Result<String, String> {
    return Result.ok("Measured speed: " + String(speed(observation)?))
}
fn exceeded(after: Point<degC>, before: Point<degC>,
            limit: Quantity<delta_degC> = 5.0@delta_degC) -> Bool {
    return after - before >= limit
}

let baseline = 20.0@degC
let observed = Observation(travel: (150.0@cm).to("m"), elapsed: 0.5@s,
                           temperature: (298.15@K).to("degC"))
print(report(observed).unwrap())
print(observed.temperature - baseline)
print(exceeded(observed.temperature, baseline))

let stalled = Observation(1.5@m, 0.0@s, 25.0@degC)
print(report(stalled).unwrap_err())
