渲染zh-Hant

instans

Translation status: 繁體中文 reader-locale proof. Code fences render through the zh-Hant pipeline; prose is canonical Latin.

Absolute point-in-time primitive with precision contract.

Syntax: instans | instans<ms> | instans<us> | instans<ns>

Category#

conversion

Examples#

radix/corpus/conversio/instans.fab (canonical · conversio)#

Conversio arms for instans precision family and textus datetime provenance.

# =============================================================================
# instans — Conversio arms for instans precision family and textus datetime provenance.
# =============================================================================
#
# What this teaches:
#   • Precision family — `instans<ms>`, `instans<us>`, `instans<ns>` let you choose sub-second precision on datetime conversion.
#   • Widening vs narrowing — coarse→fine widening is lossless; fine→coarse narrowing truncates sub-second bits.
#   • RFC3339 roundtrip — text→instans parses, instans→textus emits at the declared precision without fabricated digits.
#
# Common mistakes:
#   • Converting `instans<ns>` to `instans` and expecting sub-second precision in the text output — fine→coarse narrowing truncates sub-second bits.
#
# See also: ↦, ⇥, textus
# =============================================================================

# conversio — instans precision family and valor provenance
#
# WHY: `textus ↦ instans<N>` restores datetime provenance from wire carriers;
# `instans ↔ instans` re-tags precision; `instans ↦ textus` emits RFC3339 UTC
# at the declared precision contract (no fabricated sub-precision digits).
#
# textus ↦ instans<N>    — RFC3339 wire per target precision
# instans ↦ instans<ms>  — coarse→fine widening (lossless at storage)
# instans<ns> ↦ instans    — fine→coarse narrowing (truncates sub-second bits)
# instans ↦ textus        — precision-honoring RFC3339 `Z` emit
# textus ↦ instans ⇥ …     — explicit recovery when wire is not a datetime

main {
    const string utc  "1979-05-27T07:32:00.123456Z"
    const string offset  "1979-05-27T16:32:00+0900"

    const instant seconds  utc ↦ instant
    const instant<ms> millis  seconds ↦ instant<ms>
    const instant<us> micros  utc ↦ instant<us>
    const instant<ns> nanos  utc ↦ instant<ns>
    const instant normalized  offset ↦ instant

    assert millis ↦ string  "1979-05-27T07:32:00.000Z"
    assert micros ↦ string  "1979-05-27T07:32:00.123456Z"
    assert normalized  seconds else "offset ingest lands on same UTC instant"

    const instant<ns> fine  nanos
    const instant narrowed  fine ↦ instant
    assert narrowed ↦ string  "1979-05-27T07:32:00Z"

    const string bad  "not-a-datetime"
    const instant recovered  bad ↦ instant ⇥ seconds
    assert recovered  seconds

    print seconds ↦ string
    print millis ↦ string
    print micros ↦ string
    print nanos ↦ string
    print narrowed ↦ string
}

Expected output:

1979-05-27T07:32:00Z
1979-05-27T07:32:00.000Z
1979-05-27T07:32:00.123456Z
1979-05-27T07:32:00.123456000Z
1979-05-27T07:32:00Z

radix/corpus/instans/instans.fab (canonical · keyword)#

Absolute point-in-time primitive with precision contract.

# =============================================================================
# instans — Absolute point-in-time primitive with precision contract
# =============================================================================
#
# What this teaches:
#   • Absolute point-in-time primitive with precision contract.
#   • Related keywords: ↦, ⇥, textus
#
# Common mistakes:
#   • Using `instans ∷ T` (static ascription) instead of `instans ↦ T` (runtime conversion) — use `↦` for runtime datetime parsing and extraction (SEM016).
#
# See also: ↦, ⇥, textus
# =============================================================================

# instans — wall clock, precision contract, offset ingest, TOML provenance
#
# GRAMMAR:
#   instans | instans<ms> | instans<us> | instans<ns>
#   tempus.nunc() → instans<ns>; downconvert at use site
#   valor ↦ instans<N> | instans ↦ textus
#
# EXPECTED OUTPUT:
#   Smoke asserts exit 0 only.

import from "norma:tempus" private tempus
import from "norma:toml" private toml
import from "norma:valor" private valor

fn epoch_wire(instant t)  string {
    return t ↦ string
}

main {
    # --- precision declarations from canonical nanosecond wall clock ---
    const instant<ns> nanos  tempus.nunc()
    const instant secunda  nanos ↦ instant
    const instant<ms> millis  nanos ↦ instant<ms>
    const instant<us> micros  nanos ↦ instant<us>

    # --- valor ↦ instans: UTC wire and numeric offset normalize to same instant ---
    const valor utc  "1979-05-27T07:32:00Z"
    const valor offset  "1979-05-27T03:32:00-04:00"
    const instant parsed  utc ↦ instant
    const instant normalized  offset ↦ instant

    assert parsed  normalized else "offset ingest normalizes to UTC instant"

    # --- TOML datetime provenance (Valor::Instans carrier, not textus) ---
    const valor doc  toml.solve("creatus = 1979-05-27T07:32:00.123456Z")
    const valor carrier  valor.cape(doc, "creatus")
    const instant<us> fromToml  carrier ↦ instant<us>
    assert fromToml ↦ string  "1979-05-27T07:32:00.123456Z" else "emit honors micros contract"

    # --- precision-tagged equality: distinct at ns, equal at ms ---
    const valor leftWire  "1979-05-27T07:32:00.123456Z"
    const valor rightWire  "1979-05-27T07:32:00.123999Z"
    const instant<ns> left  leftWire ↦ instant<ns>
    const instant<ns> right  rightWire ↦ instant<ns>
    assert left  right else "sub-millisecond bits differ at nanosecond precision"
    const instant<ms> leftMs  left ↦ instant<ms>
    const instant<ms> rightMs  right ↦ instant<ms>
    assert leftMs  rightMs else "same millisecond at declared ms precision"

    # --- cross-precision conversio: widen and narrow with observable truncation ---
    const instant<ns> fine  parsed ↦ instant<ns>
    const instant<ms> coarse  fine ↦ instant<ms>
    const instant seconds  fine ↦ instant
    assert seconds ↦ string  "1979-05-27T07:32:00Z" else "narrow to seconds strips sub-second wire"

    const instant<ms> wider  secunda ↦ instant<ms>
    assert wider  millis else "cross-precision comparison at coarser operand"

    # --- wire emit and parse-back via TOML (same instant) ---
    const string wire  epoch_wire(parsed)
    const valor replayDoc  toml.solve("creatus = 1979-05-27T07:32:00Z")
    const valor replayCarrier  valor.cape(replayDoc, "creatus")
    const instant roundtrip  replayCarrier ↦ instant
    assert roundtrip  parsed else "TOML ingest roundtrip matches UTC valor extract"
    assert wire  "1979-05-27T07:32:00Z" else "seconds-precision wire emit"

    print wire, secunda, millis, micros, nanos, fromToml, coarse
}