Examples¶
Real-world lightning-safety scenarios using lightning-distance. Every example
is runnable Rust; copy any block into cargo run or the
EarlyThunder storm tracker for a live storm
timeline.
1. The classic count¶
You see a flash, count "one-Mississippi… ten-Mississippi", then hear thunder.
use lightning_distance::{miles, kilometers, is_dangerous};
let delay = 10.0; // seconds
println!("{:.1} miles ({:.1} km) away", miles(delay), kilometers(delay));
// 2.0 miles (3.3 km) away
if is_dangerous(delay) {
println!("DANGER: go inside, wait 30 min after the last thunder.");
}
2. A printable delay table¶
Generate the full "count → distance → danger" table.
use lightning_distance::{miles, kilometers, is_dangerous};
println!("{:>6} {:>8} {:>8} {:>8}", "secs", "miles", "km", "danger");
for s in [5, 10, 15, 20, 30, 45, 60] {
let s = s as f64;
println!(
"{:>6} {:>8.1} {:>8.1} {:>8}",
s, miles(s), kilometers(s), is_dangerous(s)
);
}
Output:
secs miles km danger
5 1.0 1.7 true
10 2.0 3.3 true
15 3.0 5.0 true
20 4.0 6.7 true
30 6.0 10.0 true
45 9.0 15.0 false
60 12.0 20.0 false
3. Is it approaching or retreating?¶
Three strikes in a row — watch the trend.
use lightning_distance::miles;
let strikes = [25.0_f64, 18.0, 12.0]; // delays in seconds
let mut prev = f64::INFINITY;
for (i, s) in strikes.iter().enumerate() {
let d = miles(*s);
let trend = if d < prev { "approaching ⚠" } else { "retreating" };
println!("Strike {}: {:.1} mi — {}", i + 1, d, trend);
prev = d;
}
// Strike 1: 5.0 mi — approaching
// Strike 2: 3.6 mi — approaching
// Strike 3: 2.4 mi — approaching
A shrinking distance means get inside now.
4. Metric-only output¶
For a European hike, work purely in kilometers.
use lightning_distance::{kilometers, is_dangerous};
let delay = 9.0; // seconds
println!("Blijf {:.1} km weg — gevaarlijk: {}",
kilometers(delay), is_dangerous(delay));
// 3.0 km — gevaarlijk: true
5. Tuning the constants¶
The constants are pub, so you can tighten the danger threshold (e.g. to
15 s for a more conservative outdoor-activity policy) without forking.
use lightning_distance::{miles, DANGER_THRESHOLD_SECS};
let conservative = 15.0;
let delay = 20.0;
let far_enough = delay > conservative; // false → treat as dangerous
let still_dangerous_default = delay <= DANGER_THRESHOLD_SECS; // true
println!("distance {:.1} mi", miles(delay));
println!("conservative policy safe? {}", far_enough);
Next steps¶
For a live storm tracker that logs every strike, detects approach/retreat, and runs the 30-minute reset automatically, use the EarlyThunder storm tracker.