ed564b6dda
Phase 1.5 of time-system. Calendar is pluggable: EarthCalendar (IANA zones, DST, Gregorian) is the default; MarsCalendar, CycleCalendar(period), NoCycleCalendar handle non-Earth cases. Rhythm abstracts recurrence from clock units - rhythm_cycle_phase(0.5) means "midpoint of cycle" whether the cycle is 24 hours on Earth or 30 hours on a station or 300 years on a long-cycle world. Phase 1 (Instant + Duration) unchanged. EarthCalendar(zone_local()) is the user-facing default; nobody who doesn't care about non-Earth calendars sees the abstraction. Self-host fixed point holds at 6339 lines. Snapshot tagged at dist/platform/elc.20260502-1321-self-host. Phase 2 (scheduling primitives every/after/at) lands next, now with Calendar-aware grounding instead of Earth-time hardcoded. Backlog: bl-297f66d8 (supersedes bl-b29b3e60)
19 lines
612 B
EmacsLisp
19 lines
612 B
EmacsLisp
// rhythm-cycle-30hr.el — rhythm_cycle_phase(0.5) under CycleCalendar(30.hours)
|
|
// returns the next instant at the 15-hour mark of the cycle.
|
|
|
|
fn run_test() -> Int {
|
|
let period: Duration = 30.hours
|
|
let cal: Calendar = cycle_calendar(period)
|
|
let r: Rhythm = rhythm_cycle_phase(0.5)
|
|
let base: Instant = unix_seconds(0)
|
|
let next: Instant = rhythm_next_after(r, base, cal)
|
|
let elapsed_ns: Duration = next - base
|
|
let elapsed_secs: Int = duration_to_seconds(elapsed_ns)
|
|
// 15 hours = 54000 seconds.
|
|
return elapsed_secs
|
|
}
|
|
|
|
fn main() -> Void {
|
|
println(int_to_str(run_test()))
|
|
}
|