Skip to content

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.