~/bend-docscommunity

instant.bend source

instant.bend on the hub · documented module

import Baseimport ./date.bend as Dimport ./duration.bend as Durtype Instant.Error is Data:  OutOfRange{}type Instant is Data:  Instant{days: U32, sod: U32, nanos: U32}def Instant.epoch_days() -> U32:  719468def Instant.unix_fit(+udays: U32, +sod: U32) -> Bool:  Bool.or(    U32.is_lt(udays, 49710),    Bool.and(U32.is_eq(udays, 49710), U32.is_le(sod, 23295))  )def Instant.to_unix.add(  +udays: U32, +sod: U32, ok: Bool) -> Result<&2, &2, Instant.Error, U32>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Done{U32.add(U32.mul(udays, 86400), sod)}def Instant.to_unix.d(  +udays: U32, +sod: U32) -> Result<&2, &2, Instant.Error, U32>:  Instant.to_unix.add(udays, sod, Instant.unix_fit(udays, sod))def Instant.to_unix.ge(  +days: U32, +sod: U32, ok: Bool) -> Result<&2, &2, Instant.Error, U32>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Instant.to_unix.d(U32.sub(days, Instant.epoch_days()), sod)def Instant.to_unix(i: Instant) -> Result<&2, &2, Instant.Error, U32>:  match i:    case Instant{+days, +sod, _}:      Instant.to_unix.ge(days, sod, U32.is_ge(days, Instant.epoch_days()))def Instant.from_unix(+secs: U32) -> Instant:  Instant{    U32.add(U32.div(secs, 86400), Instant.epoch_days()),    U32.mod(secs, 86400),    0  }def Instant.from_utc_date(d: D.Date) -> Instant:  Instant{D.Date.to_days(d), 0, 0}def Instant.to_utc_date(i: Instant) -> Result<&2, &2, D.Date.Error, D.Date>:  match i:    case Instant{days, _, _}:      D.Date.from_days(days)def Instant.is_eq(a: Instant, b: Instant) -> Bool:  match a b:    case Instant{+d1, +s1, +n1} Instant{+d2, +s2, +n2}:      Bool.and(        U32.is_eq(d1, d2),        Bool.and(U32.is_eq(s1, s2), U32.is_eq(n1, n2))      )def Instant.is_lt.n(+n1: U32, +n2: U32, eq_s: Bool, slt: Bool) -> Bool:  match eq_s:    case False{}:      slt    case True{}:      U32.is_lt(n1, n2)def Instant.is_lt.s(  +s1: U32, +n1: U32, +s2: U32, +n2: U32, eq_d: Bool, dlt: Bool) -> Bool:  match eq_d:    case False{}:      dlt    case True{}:      Instant.is_lt.n(n1, n2, U32.is_eq(s1, s2), U32.is_lt(s1, s2))def Instant.is_lt(a: Instant, b: Instant) -> Bool:  match a b:    case Instant{+d1, +s1, +n1} Instant{+d2, +s2, +n2}:      Instant.is_lt.s(s1, n1, s2, n2, U32.is_eq(d1, d2), U32.is_lt(d1, d2))def Instant.is_gt(a: Instant, b: Instant) -> Bool:  Instant.is_lt(b, a)def Instant.is_le(a: Instant, b: Instant) -> Bool:  Bool.not(Instant.is_lt(b, a))def Instant.is_ge(a: Instant, b: Instant) -> Bool:  Bool.not(Instant.is_lt(a, b))def Instant.from.date(  +days: U32, +sod: U32, +nanos: U32, r: Result<&2, &2, D.Date.Error, D.Date>) -> Result<&2, &2, Instant.Error, Instant>:  match r:    case Fail{_}:      Fail{OutOfRange{}}    case Done{_}:      Done{Instant{days, sod, nanos}}def Instant.from.rng(  +days: U32, +sod: U32, +nanos: U32, ok: Bool) -> Result<&2, &2, Instant.Error, Instant>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Instant.from.date(days, sod, nanos, D.Date.from_days(days))def Instant.from(  +days: U32, +sod: U32, +nanos: U32) -> Result<&2, &2, Instant.Error, Instant>:  Instant.from.rng(    days, sod, nanos,    Bool.and(U32.is_le(sod, 86399), U32.is_le(nanos, 999999999))  )def Instant.of_dur.map(  r: Result<&2, &2, Dur.Duration.Error, Dur.Duration>) -> Result<&2, &2, Instant.Error, Instant>:  match r:    case Fail{_}:      Fail{OutOfRange{}}    case Done{Dur.Duration{days, sod, nanos}}:      Instant.from(days, sod, nanos)def Instant.as_dur(i: Instant) -> Dur.Duration:  match i:    case Instant{days, sod, nanos}:      Dur.Duration{days, sod, nanos}def Instant.add(  i: Instant, d: Dur.Duration) -> Result<&2, &2, Instant.Error, Instant>:  Instant.of_dur.map(Dur.Duration.add(Instant.as_dur(i), d))def Instant.sub(  i: Instant, d: Dur.Duration) -> Result<&2, &2, Instant.Error, Instant>:  Instant.of_dur.map(Dur.Duration.sub(Instant.as_dur(i), d))def Instant.until.map(  r: Result<&2, &2, Dur.Duration.Error, Dur.Duration>) -> Result<&2, &2, Instant.Error, Dur.Duration>:  match r:    case Fail{_}:      Fail{OutOfRange{}}    case Done{d}:      Done{d}def Instant.until.ord(  start: Instant, end: Instant, lt: Bool) -> Result<&2, &2, Instant.Error, Dur.Duration>:  match lt:    case True{}:      Fail{OutOfRange{}}    case False{}:      Instant.until.map(        Dur.Duration.sub(Instant.as_dur(end), Instant.as_dur(start))      )def Instant.until(  +start: Instant, +end: Instant) -> Result<&2, &2, Instant.Error, Dur.Duration>:  Instant.until.ord(start, end, Instant.is_lt(end, start))def Instant.trunc_sec(i: Instant) -> Instant:  match i:    case Instant{days, sod, _}:      Instant{days, sod, 0}def Instant.trunc_min(i: Instant) -> Instant:  match i:    case Instant{days, +sod, _}:      Instant{days, U32.sub(sod, U32.mod(sod, 60)), 0}def Instant.trunc_hour(i: Instant) -> Instant:  match i:    case Instant{days, +sod, _}:      Instant{days, U32.sub(sod, U32.mod(sod, 3600)), 0}def Instant.trunc_day(i: Instant) -> Instant:  match i:    case Instant{days, _, _}:      Instant{days, 0, 0}