50 lines
967 B
TypeScript
50 lines
967 B
TypeScript
export const RADIX = 36;
|
|
|
|
export class Timestamp {
|
|
readonly time: number;
|
|
readonly logical: number;
|
|
|
|
constructor(time: TimeLike, logical = 0) {
|
|
this.time = typeof time === "string" ? parseInt(time, RADIX) : time;
|
|
this.logical = logical;
|
|
}
|
|
|
|
static bigger(a: Timestamp, b: Timestamp): Timestamp {
|
|
return a.compare(b) === -1 ? b : a;
|
|
}
|
|
|
|
encode(): string {
|
|
return this.time.toString(RADIX);
|
|
}
|
|
|
|
compare(other: Timestamp): 1 | 0 | -1 {
|
|
if (this.time > other.time) {
|
|
return 1;
|
|
}
|
|
if (this.time < other.time) {
|
|
return -1;
|
|
}
|
|
if (this.logical > other.logical) {
|
|
return 1;
|
|
}
|
|
if (this.logical < other.logical) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
toJSON(): TimestampJSON {
|
|
return Object.freeze({
|
|
time: this.encode(),
|
|
logical: this.logical,
|
|
});
|
|
}
|
|
}
|
|
|
|
export type TimeLike = string | number;
|
|
|
|
type TimestampJSON = {
|
|
readonly time: string;
|
|
readonly logical: number;
|
|
};
|