time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

DateTime.js (2707B)


      1 import { Ok } from "./result.js";
      2 import * as Result from "./result.js";
      3 export const Duration = {
      4     minute: 60 * 1000,
      5     hour: 60 * 60 * 1000,
      6     day: 24 * 60 * 60 * 1000,
      7     year: 24 * 60 * 60 * 1000 * 365.25,
      8     fromFloat: (f) => f,
      9     toFloat: (d) => d,
     10     fromMinutes: (h) => h * Duration.minute,
     11     fromHours: (h) => h * Duration.hour,
     12     fromDays: (d) => d * Duration.day,
     13     fromYears: (y) => y * Duration.year,
     14     toMinutes: (t) => t / Duration.minute,
     15     toHours: (t) => t / Duration.hour,
     16     toDays: (t) => t / Duration.day,
     17     toYears: (t) => t / Duration.year,
     18     toString(t) {
     19         const shouldPluralize = (f) => f !== 1.0;
     20         const display = (f, s) => `${f.toPrecision(3)} ${s}${shouldPluralize(f) ? "s" : ""}`;
     21         const abs = Math.abs(t);
     22         if (abs >= Duration.year) {
     23             return display(t / Duration.year, "year");
     24         }
     25         else if (abs >= Duration.day) {
     26             return display(t / Duration.day, "day");
     27         }
     28         else if (abs >= Duration.hour) {
     29             return display(t / Duration.hour, "hour");
     30         }
     31         else if (abs >= Duration.minute) {
     32             return display(t / Duration.minute, "minute");
     33         }
     34         else {
     35             return t.toFixed() + "ms";
     36         }
     37     },
     38     add: (t1, t2) => t1 + t2,
     39     subtract: (t1, t2) => t1 - t2,
     40     multiply: (t1, t2) => t1 * t2,
     41     divide: (t1, t2) => t1 / t2,
     42 };
     43 export const DateModule = {
     44     toString(d) {
     45         return d.toDateString();
     46     },
     47     fmap(t, fn) {
     48         return new Date(fn(t.getTime()));
     49     },
     50     subtract(t1, t2) {
     51         const [f1, f2] = [t1.getTime(), t2.getTime()];
     52         const diff = f1 - f2;
     53         if (diff < 0) {
     54             return Result.Err("Cannot subtract a date by one that is in its future");
     55         }
     56         else {
     57             return Ok(Duration.fromFloat(diff));
     58         }
     59     },
     60     addDuration(t, duration) {
     61         return DateModule.fmap(t, (t) => t + duration);
     62     },
     63     subtractDuration(t, duration) {
     64         return DateModule.fmap(t, (t) => t - duration);
     65     },
     66     makeWithYearInt(y) {
     67         if (y < 100) {
     68             return Result.Err("Year must be over 100");
     69         }
     70         else if (y > 200000) {
     71             return Result.Err("Year must be less than 200000");
     72         }
     73         else {
     74             return Ok(new Date(y, 0));
     75         }
     76     },
     77     makeFromYear(year) {
     78         const floor = Math.floor(year);
     79         return Result.fmap(DateModule.makeWithYearInt(floor), (earlyDate) => {
     80             const diff = year - floor;
     81             return DateModule.addDuration(earlyDate, diff * Duration.year);
     82         });
     83     },
     84 };
     85 export { DateModule as Date };
     86 //# sourceMappingURL=DateTime.js.map