Skip to content

Duration Domain

The Duration domain provides a type-safe way to represent Spans of Time.

In many systems, a timeout is just an integer like 500. But is that 500 milliseconds? 500 seconds? Ambiguous units cause outages (like setting a 30-second timeout that the system reads as 30 milliseconds).

Duration solves this by wrapping the number in a type that knows its unit. 500 becomes 500ms or 0.5s. The compiler ensures you don't compare Seconds to Apples, stopping bugs before they start.

Overview

aivi
use aivi.duration (Duration)

// Clear, unambiguous literals
timeout = 500ms
delay = 2seconds

// Type-safe comparison
if delay > timeout {
    // ...
}

Features

aivi
Span = { millis: Int }

Domain Definition

aivi
domain Duration over Span = {
  type Delta = Millisecond Int | Second Int | Minute Int | Hour Int
  
  (+) : Span -> Delta -> Span
  (+) span (Millisecond n) = { millis: span.millis + n }
  (+) span (Second n)      = { millis: span.millis + n * 1000 }
  (+) span (Minute n)      = { millis: span.millis + n * 60000 }
  (+) span (Hour n)        = { millis: span.millis + n * 3600000 }
  
  (-) : Span -> Delta -> Span
  (-) span delta = span + (negateDelta delta)
  
  // Span arithmetic
  (+) : Span -> Span -> Span
  (+) s1 s2 = { millis: s1.millis + s2.millis }
  
  // Delta literals
  1ms = Millisecond 1
  1s = Second 1
  1min = Minute 1
  1h = Hour 1
}

Usage Examples

aivi
use aivi.duration

timeout = { millis: 0 } + 30s
delay = timeout + 500ms
longPoll = { millis: 0 } + 5min