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