How do I compare two timeout values in milliseconds in EK9?

← Operators and Expressions · Ref: Q1194

EK9 Millisecond is a built-in type with literal syntax and full operator support.

MILLISECOND LITERALS

  shortTimeout <- 250ms
  longTimeout <- 5000ms

COMPARISON

  if shortTimeout < longTimeout   shorter timeout
  ordering <- shortTimeout <=> longTimeout

COALESCING

  quickest <- shortTimeout <? longTimeout  returns the shorter
  slowest <- shortTimeout >? longTimeout   returns the longer

Millisecond supports the same operator set as Duration, Date, Integer — EK9's type system is consistent.

See Q542 for temporal comparison. See Q243 for coalescing operators.

Example

defines module qa.operators.millisecondcompare

  defines function

    <?- Compare two millisecond values and return spaceship ordering. -?>
    compareMs() as pure
      ->
        left as Millisecond
        right as Millisecond
      <- rtn as Integer: left <=> right

    <?- Check if the first timeout is shorter than the second. -?>
    isShorter() as pure
      ->
        left as Millisecond
        right as Millisecond
      <- rtn as Boolean: left < right

    <?- Return the quicker of two timeouts using coalescing min. -?>
    quickerOf() as pure
      ->
        left as Millisecond
        right as Millisecond
      <- rtn as Millisecond: left <? right

    <?- Return the slower of two timeouts using coalescing max. -?>
    slowerOf() as pure
      ->
        left as Millisecond
        right as Millisecond
      <- rtn as Millisecond: left >? right

  defines program

    MillisecondCompareDemo()
      stdout <- Stdout()

      // === MILLISECOND LITERALS ===

      shortTimeout <- 250ms
      longTimeout <- 5000ms
      mediumTimeout <- 1500ms

      // === COMPARISON VIA FUNCTION ===

      shorter <- isShorter(shortTimeout, longTimeout)
      stdout.println(`Short is faster: ${shorter}`)

      // === SPACESHIP ORDERING VIA FUNCTION ===

      ordering <- compareMs(shortTimeout, longTimeout)
      stdout.println(`Short <=> Long: ${ordering}`)

      mediumOrder <- compareMs(mediumTimeout, longTimeout)
      stdout.println(`Medium <=> Long: ${mediumOrder}`)

      // === COALESCING: FIND QUICKEST AND SLOWEST ===

      quickest <- quickerOf(shortTimeout, longTimeout)
      slowest <- slowerOf(shortTimeout, longTimeout)
      stdout.println(`Quickest: ${quickest}`)
      stdout.println(`Slowest: ${slowest}`)

      // === SORTED TIMEOUT LIST VIA STREAM ===

      timeouts <- List() of Millisecond
      timeouts += longTimeout
      timeouts += shortTimeout
      timeouts += mediumTimeout

      sorted <- cat timeouts | sort | collect as List of Millisecond
      stdout.println(`Sorted timeouts: ${sorted}`)

      // === STRING AND ISSET ===

      msStr <- $shortTimeout
      stdout.println(`Timeout as string: ${msStr}`)
      require shortTimeout?

      unsetMs <- Millisecond()
      require ~unsetMs?

      // === COPY OPERATOR ===

      backup <- 0ms
      backup :=: shortTimeout
      stdout.println(`Copied timeout: ${backup}`)

Common mistakes

E50060 — Millisecond values are already in milliseconds and support comparison operators directly — there is no 'toMillis()' method to resolve. See ek9 -h E50060 for details.

Incorrect:

left.toMillis() < right.toMillis()

Correct:

left < right
Other ways to ask this
  • Compare Millisecond values to determine which timeout is shorter.
  • I need to select the shorter of two network timeouts.
  • In Java I compared long millisecond values — how does EK9 handle this?

Coming from another language?

Java: plain long for millis, System.currentTimeMillis(), no type safety. Python: float seconds, no millis type. Rust: Duration::from_millis(). Go: time.Duration(n * time.Millisecond). EK9: 250ms literals, direct comparison, type-safe millisecond operations.

Keywords: timeout, duration, shorter, millisecond, longer, compare, operator, latency, ms, network