~/bend-docscommunity

duration.bend source

duration.bend on the hub · documented module

import Basetype Duration.Error is Data:  OutOfRange{}type Duration is Data:  Duration{days: U32, sod: U32, nanos: U32}def Duration.zero() -> Duration:  Duration{0, 0, 0}def Duration.fit(+days: U32, +sod: U32) -> Bool:  Bool.or(    U32.is_lt(days, 49710),    Bool.and(U32.is_eq(days, 49710), U32.is_le(sod, 23295))  )def Duration.to_secs.add(  +days: U32, +sod: U32, ok: Bool) -> Result<&2, &2, Duration.Error, U32>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Done{U32.add(U32.mul(days, 86400), sod)}def Duration.to_secs(d: Duration) -> Result<&2, &2, Duration.Error, U32>:  match d:    case Duration{+days, +sod, _}:      Duration.to_secs.add(days, sod, Duration.fit(days, sod))def Duration.from_secs(+secs: U32) -> Duration:  Duration{U32.div(secs, 86400), U32.mod(secs, 86400), 0}def Duration.from_hms.s2(  +sec: U32, +s: U32, ok: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Done{Duration.from_secs(U32.add(sec, s))}def Duration.from_hms.s(  +sec: U32, +s: U32) -> Result<&2, &2, Duration.Error, Duration>:  Duration.from_hms.s2(sec, s, U32.is_le(s, U32.sub(U32.not(0), sec)))def Duration.from_hms.hm2(  +hsec: U32, +msec: U32, +s: U32, ok: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Duration.from_hms.s(U32.add(hsec, msec), s)def Duration.from_hms.hm(  +hsec: U32, +mi: U32, +s: U32) -> Result<&2, &2, Duration.Error, Duration>:  +msec = U32.mul(mi, 60)  Duration.from_hms.hm2(    hsec, msec, s, U32.is_le(msec, U32.sub(U32.not(0), hsec))  )def Duration.from_hms.h(  +h: U32, +mi: U32, +s: U32, ok: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Duration.from_hms.hm(U32.mul(h, 3600), mi, s)def Duration.from_hms.r(  +h: U32, +mi: U32, +s: U32, ok: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Duration.from_hms.h(        h, mi, s, U32.is_le(h, U32.div(U32.not(0), 3600))      )def Duration.from_hms(  +h: U32, +mi: U32, +s: U32) -> Result<&2, &2, Duration.Error, Duration>:  Duration.from_hms.r(    h, mi, s, Bool.and(U32.is_le(mi, 59), U32.is_le(s, 59))  )def Duration.is_eq(a: Duration, b: Duration) -> Bool:  match a b:    case Duration{+d1, +s1, +n1} Duration{+d2, +s2, +n2}:      Bool.and(        U32.is_eq(d1, d2),        Bool.and(U32.is_eq(s1, s2), U32.is_eq(n1, n2))      )def Duration.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 Duration.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{}:      Duration.is_lt.n(n1, n2, U32.is_eq(s1, s2), U32.is_lt(s1, s2))def Duration.is_lt(a: Duration, b: Duration) -> Bool:  match a b:    case Duration{+d1, +s1, +n1} Duration{+d2, +s2, +n2}:      Duration.is_lt.s(        s1, n1, s2, n2, U32.is_eq(d1, d2), U32.is_lt(d1, d2)      )def Duration.is_gt(a: Duration, b: Duration) -> Bool:  Duration.is_lt(b, a)def Duration.is_le(a: Duration, b: Duration) -> Bool:  Bool.not(Duration.is_lt(b, a))def Duration.is_ge(a: Duration, b: Duration) -> Bool:  Bool.not(Duration.is_lt(a, b))def Duration.add.days(  +d1: U32, +d2: U32, +sod: U32, +nanos: U32, carry: U32, ok: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Done{Duration{U32.add(U32.add(d1, d2), carry), sod, nanos}}def Duration.add.sod2(  +d1: U32, +d2: U32, +sod: U32, +nanos: U32, ge: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ge:    case False{}:      Duration.add.days(        d1, d2, sod, nanos, 0, U32.is_le(d2, U32.sub(U32.not(0), d1))      )    case True{}:      Duration.add.days(        d1, d2, U32.sub(sod, 86400), nanos, 1,        U32.is_le(U32.add(d2, 1), U32.sub(U32.not(0), d1))      )def Duration.add.sod(  +d1: U32, +d2: U32, +s1: U32, +s2: U32, +nanos: U32, nc: U32) -> Result<&2, &2, Duration.Error, Duration>:  +sod = U32.add(U32.add(s1, s2), nc)  Duration.add.sod2(d1, d2, sod, nanos, U32.is_ge(sod, 86400))def Duration.add.n2(  +d1: U32, +d2: U32, +s1: U32, +s2: U32, +ns: U32, ge: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ge:    case False{}:      Duration.add.sod(d1, d2, s1, s2, ns, 0)    case True{}:      Duration.add.sod(d1, d2, s1, s2, U32.sub(ns, 1000000000), 1)def Duration.add.n(  +d1: U32, +d2: U32, +s1: U32, +s2: U32, +n1: U32, +n2: U32) -> Result<&2, &2, Duration.Error, Duration>:  +ns = U32.add(n1, n2)  Duration.add.n2(d1, d2, s1, s2, ns, U32.is_ge(ns, 1000000000))def Duration.add(  a: Duration, b: Duration) -> Result<&2, &2, Duration.Error, Duration>:  match a b:    case Duration{d1, s1, n1} Duration{d2, s2, n2}:      Duration.add.n(d1, d2, s1, s2, n1, n2)def Duration.sub.days(  +days: U32, +sod: U32, +nanos: U32, +b_days: U32, ok: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match ok:    case False{}:      Fail{OutOfRange{}}    case True{}:      Done{Duration{U32.sub(days, b_days), sod, nanos}}def Duration.sub.s2(  +days: U32, +sod: U32, +nanos: U32, +b_days: U32, +b_sod: U32, borrow: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match borrow:    case False{}:      Duration.sub.days(days, U32.sub(sod, b_sod), nanos, b_days, U32.is_ge(days, b_days))    case True{}:      Duration.sub.days(        U32.sub(days, 1), U32.sub(U32.add(sod, 86400), b_sod), nanos, b_days,        U32.is_ge(days, U32.add(b_days, 1))      )def Duration.sub.s(  +days: U32, +sod: U32, +nanos: U32, +b_days: U32, +b_sod: U32) -> Result<&2, &2, Duration.Error, Duration>:  Duration.sub.s2(days, sod, nanos, b_days, b_sod, U32.is_lt(sod, b_sod))def Duration.sub.n2(  +days: U32, +sod: U32, +n1: U32, +b_days: U32, +b_sod: U32, +b_n: U32, borrow: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match borrow:    case False{}:      Duration.sub.s(days, sod, U32.sub(n1, b_n), b_days, b_sod)    case True{}:      Duration.sub.s(        days, sod, U32.sub(U32.add(n1, 1000000000), b_n), b_days, b_sod      )def Duration.sub.n0(  +days: U32, +n1: U32, +b_days: U32, +b_sod: U32, +b_n: U32, zdays: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match zdays:    case True{}:      Fail{OutOfRange{}}    case False{}:      Duration.sub.s(        U32.sub(days, 1), 86399, U32.sub(U32.add(n1, 1000000000), b_n),        b_days, b_sod      )def Duration.sub.n2b(  +days: U32, +sod: U32, +n1: U32, +b_days: U32, +b_sod: U32, +b_n: U32, borrow: Bool, z: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match borrow z:    case True{} True{}:      Duration.sub.n0(days, n1, b_days, b_sod, b_n, U32.is_eq(days, 0))    case True{} False{}:      Duration.sub.n2(days, U32.sub(sod, 1), n1, b_days, b_sod, b_n, True{})    case False{} True{}:      Duration.sub.n2(days, sod, n1, b_days, b_sod, b_n, False{})    case False{} False{}:      Duration.sub.n2(days, sod, n1, b_days, b_sod, b_n, False{})def Duration.sub.n(  +days: U32, +sod: U32, +n1: U32, +b_days: U32, +b_sod: U32, +b_n: U32) -> Result<&2, &2, Duration.Error, Duration>:  +borrow = U32.is_lt(n1, b_n)  Duration.sub.n2b(days, sod, n1, b_days, b_sod, b_n, borrow, U32.is_eq(sod, 0))def Duration.sub.go(a: Duration, b: Duration) -> Result<&2, &2, Duration.Error, Duration>:  match a b:    case Duration{d1, s1, n1} Duration{d2, s2, n2}:      Duration.sub.n(d1, s1, n1, d2, s2, n2)def Duration.sub.lt(  a: Duration, b: Duration, lt: Bool) -> Result<&2, &2, Duration.Error, Duration>:  match lt:    case True{}:      Fail{OutOfRange{}}    case False{}:      Duration.sub.go(a, b)def Duration.sub(  +a: Duration, +b: Duration) -> Result<&2, &2, Duration.Error, Duration>:  Duration.sub.lt(a, b, Duration.is_lt(a, b))