@panyam/tsutils 0.0.55 → 0.0.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cjs/dal.d.ts CHANGED
@@ -11,7 +11,7 @@ export declare class Resource extends BaseEntity {
11
11
  visibility: "public" | "private" | "limited";
12
12
  visibleTo: string[];
13
13
  constructor(config?: any);
14
- isVisibleTo(userId: string): boolean;
14
+ isVisibleTo(userId: string | null): boolean;
15
15
  get version(): number;
16
16
  get hasKey(): boolean;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dal.js","sourceRoot":"","sources":["../../src/dal.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAKrB,YAAY,MAAY;QACtB,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;CACF;AAXD,gCAWC;AAED,MAAa,QAAS,SAAQ,UAAU;IAatC,YAAY,MAAY;QACtB,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC9D,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,CAAC,CAAC;IACX,CAAC;IAGD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;CACF;AAlCD,4BAkCC","sourcesContent":["import { Timestamp } from \"./types\";\n\nexport class BaseEntity {\n isActive: boolean;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n\n constructor(config?: any) {\n config = config || {};\n this.isActive = config.isActive == false ? false : true;\n this.createdAt = config.createdAt || Date.now();\n this.updatedAt = config.updatedAt || Date.now();\n }\n}\n\nexport class Resource extends BaseEntity {\n // Collection ID\n id: string;\n\n // Owner/Creator of this collection\n userId: string;\n\n // Visibility status\n visibility: \"public\" | \"private\" | \"limited\";\n\n // Who can see this score\n visibleTo: string[];\n\n constructor(config?: any) {\n super((config = config || {}));\n this.id = \"\" + (config.id || \"\");\n this.userId = \"\" + (config.userId || \"\");\n this.visibleTo = config.visibleTo || [];\n this.visibility = (config.visibility || \"private\").toLowerCase();\n }\n\n isVisibleTo(userId: string): boolean {\n return this.userId == userId || this.visibility == \"public\";\n }\n\n // TODO - move this to schema and/or decorators\n get version(): number {\n return 0;\n }\n\n // And others things here\n get hasKey(): boolean {\n return this.id.trim().length > 0;\n }\n}\n"]}
1
+ {"version":3,"file":"dal.js","sourceRoot":"","sources":["../../src/dal.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAKrB,YAAY,MAAY;QACtB,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;CACF;AAXD,gCAWC;AAED,MAAa,QAAS,SAAQ,UAAU;IAatC,YAAY,MAAY;QACtB,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IAED,WAAW,CAAC,MAAqB;QAC/B,OAAO,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC9D,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,CAAC,CAAC;IACX,CAAC;IAGD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;CACF;AAlCD,4BAkCC","sourcesContent":["import { Timestamp } from \"./types\";\n\nexport class BaseEntity {\n isActive: boolean;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n\n constructor(config?: any) {\n config = config || {};\n this.isActive = config.isActive == false ? false : true;\n this.createdAt = config.createdAt || Date.now();\n this.updatedAt = config.updatedAt || Date.now();\n }\n}\n\nexport class Resource extends BaseEntity {\n // Collection ID\n id: string;\n\n // Owner/Creator of this collection\n userId: string;\n\n // Visibility status\n visibility: \"public\" | \"private\" | \"limited\";\n\n // Who can see this score\n visibleTo: string[];\n\n constructor(config?: any) {\n super((config = config || {}));\n this.id = \"\" + (config.id || \"\");\n this.userId = \"\" + (config.userId || \"\");\n this.visibleTo = config.visibleTo || [];\n this.visibility = (config.visibility || \"private\").toLowerCase();\n }\n\n isVisibleTo(userId: string | null): boolean {\n return this.userId == userId || this.visibility == \"public\";\n }\n\n // TODO - move this to schema and/or decorators\n get version(): number {\n return 0;\n }\n\n // And others things here\n get hasKey(): boolean {\n return this.id.trim().length > 0;\n }\n}\n"]}
@@ -7,22 +7,23 @@ export declare class Fraction {
7
7
  static readonly ZERO: Fraction;
8
8
  static readonly ONE: Fraction;
9
9
  static readonly INFINITY: Fraction;
10
- constructor(num?: number, den?: number);
10
+ constructor(num?: number, den?: number, factorized?: boolean);
11
+ static parse(val: string, factorized?: boolean): Fraction;
11
12
  get isWhole(): boolean;
12
13
  get isZero(): boolean;
13
14
  get isInfinity(): boolean;
14
15
  get isOne(): boolean;
15
16
  get ceil(): number;
16
17
  get floor(): number;
17
- plus(another: Fraction): Fraction;
18
- plusNum(another: number): Fraction;
19
- minus(another: Fraction): Fraction;
20
- minusNum(another: number): Fraction;
21
- times(another: Fraction): Fraction;
22
- timesNum(another: number): Fraction;
23
- divby(another: Fraction): Fraction;
24
- divbyNum(another: number): Fraction;
25
- numDivby(another: number): Fraction;
18
+ plus(another: Fraction, factorized?: boolean): Fraction;
19
+ plusNum(another: number, factorized?: boolean): Fraction;
20
+ minus(another: Fraction, factorized?: boolean): Fraction;
21
+ minusNum(another: number, factorized?: boolean): Fraction;
22
+ times(another: Fraction, factorized?: boolean): Fraction;
23
+ timesNum(another: number, factorized?: boolean): Fraction;
24
+ divby(another: Fraction, factorized?: boolean): Fraction;
25
+ divbyNum(another: number, factorized?: boolean): Fraction;
26
+ numDivby(another: number, factorized?: boolean): Fraction;
26
27
  mod(another: Fraction): Fraction;
27
28
  modNum(another: number): Fraction;
28
29
  get inverse(): Fraction;
@@ -43,4 +44,4 @@ export declare class Fraction {
43
44
  static max(f1: Fraction, f2: Fraction): Fraction;
44
45
  static min(f1: Fraction, f2: Fraction): Fraction;
45
46
  }
46
- export declare const Frac: (a?: number, b?: number) => Fraction;
47
+ export declare const Frac: (a?: number, b?: number, factorized?: boolean) => Fraction;
@@ -44,13 +44,43 @@ function gcdof(x, y) {
44
44
  }
45
45
  exports.gcdof = gcdof;
46
46
  class Fraction {
47
- constructor(num = 0, den = 1) {
47
+ constructor(num = 0, den = 1, factorized = false) {
48
48
  if (isNaN(num) || isNaN(den)) {
49
- throw new Error("Invalid numerator or denminator");
49
+ throw new Error(`Invalid numerator(${num}) or denminator(${den})`);
50
+ }
51
+ if (factorized) {
52
+ const gcd = gcdof(num, den);
53
+ num /= gcd;
54
+ den /= gcd;
50
55
  }
51
56
  this.num = num;
52
57
  this.den = den;
53
58
  }
59
+ static parse(val, factorized = false) {
60
+ const parts = val
61
+ .trim()
62
+ .split("/")
63
+ .map((x) => x.trim());
64
+ let num = 1;
65
+ let den = 1;
66
+ if (parts.length == 1)
67
+ num = parseInt(parts[0]);
68
+ else if (parts.length != 2) {
69
+ throw new Error("Invalid fraction string: " + val);
70
+ }
71
+ else {
72
+ if (parts[0].length > 0) {
73
+ num = parseInt(parts[0]);
74
+ }
75
+ if (parts[1].length > 0) {
76
+ den = parseInt(parts[1]);
77
+ }
78
+ }
79
+ if (isNaN(num) || isNaN(den)) {
80
+ throw new Error("Invalid fraction string: " + val);
81
+ }
82
+ return new Fraction(num, den, factorized);
83
+ }
54
84
  get isWhole() {
55
85
  return this.num % this.den == 0;
56
86
  }
@@ -79,32 +109,32 @@ class Fraction {
79
109
  return Math.floor(this.num / this.den);
80
110
  }
81
111
  }
82
- plus(another) {
83
- return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den);
112
+ plus(another, factorized = false) {
113
+ return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den, factorized);
84
114
  }
85
- plusNum(another) {
86
- return new Fraction(this.num + this.den * another, this.den);
115
+ plusNum(another, factorized = false) {
116
+ return new Fraction(this.num + this.den * another, this.den, factorized);
87
117
  }
88
- minus(another) {
89
- return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den);
118
+ minus(another, factorized = false) {
119
+ return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den, factorized);
90
120
  }
91
- minusNum(another) {
92
- return new Fraction(this.num - this.den * another, this.den);
121
+ minusNum(another, factorized = false) {
122
+ return new Fraction(this.num - this.den * another, this.den, factorized);
93
123
  }
94
- times(another) {
95
- return new Fraction(this.num * another.num, this.den * another.den);
124
+ times(another, factorized = false) {
125
+ return new Fraction(this.num * another.num, this.den * another.den, factorized);
96
126
  }
97
- timesNum(another) {
98
- return new Fraction(this.num * another, this.den);
127
+ timesNum(another, factorized = false) {
128
+ return new Fraction(this.num * another, this.den, factorized);
99
129
  }
100
- divby(another) {
101
- return new Fraction(this.num * another.den, this.den * another.num);
130
+ divby(another, factorized = false) {
131
+ return new Fraction(this.num * another.den, this.den * another.num, factorized);
102
132
  }
103
- divbyNum(another) {
104
- return new Fraction(this.num, this.den * another);
133
+ divbyNum(another, factorized = false) {
134
+ return new Fraction(this.num, this.den * another, factorized);
105
135
  }
106
- numDivby(another) {
107
- return new Fraction(this.den * another, this.num);
136
+ numDivby(another, factorized = false) {
137
+ return new Fraction(this.den * another, this.num, factorized);
108
138
  }
109
139
  mod(another) {
110
140
  const d = this.divby(another);
@@ -173,6 +203,6 @@ exports.Fraction = Fraction;
173
203
  Fraction.ZERO = new Fraction();
174
204
  Fraction.ONE = new Fraction(1, 1);
175
205
  Fraction.INFINITY = new Fraction(1, 0);
176
- const Frac = (a = 0, b = 1) => new Fraction(a, b);
206
+ const Frac = (a = 0, b = 1, factorized = false) => new Fraction(a, b, factorized);
177
207
  exports.Frac = Frac;
178
208
  //# sourceMappingURL=numberutils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"numberutils.js","sourceRoot":"","sources":["../../src/numberutils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"./types\";\n\nexport function range(start: number, end: Nullable<number> = null, incr: Nullable<number> = 1): number[] {\n if (end == null) {\n const absStart = Math.abs(start);\n const arr = Array.from({ length: absStart });\n if (start >= 0) {\n return arr.map((x, i) => i);\n } else {\n return arr.map((x, i) => i - (absStart - 1));\n }\n }\n const out: number[] = [];\n if (incr == null) {\n incr = 1;\n }\n incr = Math.abs(incr);\n if (start !== end) {\n if (start < end) {\n for (let i = start; i <= end; i += incr) {\n out.push(i);\n }\n } else {\n for (let i = start; i >= end; i -= incr) {\n out.push(i);\n }\n }\n }\n return out;\n}\n\n/*\nexport function applyMixins(derivedCtor: any, baseCtors: any[]) {\n baseCtors.forEach(baseCtor => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {\n Object.defineProperty(derivedCtor.prototype, name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name));\n });\n });\n}\n*/\n\nexport function gcdof(x: number, y: number): number {\n x = Math.abs(x);\n y = Math.abs(y);\n while (y > 0) {\n const t = y;\n y = x % y;\n x = t;\n }\n return x;\n}\n\nexport class Fraction {\n readonly num: number;\n readonly den: number;\n\n static readonly ZERO = new Fraction();\n static readonly ONE = new Fraction(1, 1);\n static readonly INFINITY = new Fraction(1, 0);\n\n constructor(num = 0, den = 1) {\n if (isNaN(num) || isNaN(den)) {\n throw new Error(\"Invalid numerator or denminator\");\n }\n this.num = num;\n this.den = den;\n }\n\n get isWhole(): boolean {\n return this.num % this.den == 0;\n }\n\n get isZero(): boolean {\n return this.num == 0;\n }\n\n get isInfinity(): boolean {\n return this.den == 0;\n }\n\n get isOne(): boolean {\n return this.num == this.den;\n }\n\n get ceil(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return 1 + Math.floor(this.num / this.den);\n }\n }\n\n get floor(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return Math.floor(this.num / this.den);\n }\n }\n\n plus(another: Fraction): Fraction {\n return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den);\n }\n\n plusNum(another: number): Fraction {\n return new Fraction(this.num + this.den * another, this.den);\n }\n\n minus(another: Fraction): Fraction {\n return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den);\n }\n\n minusNum(another: number): Fraction {\n return new Fraction(this.num - this.den * another, this.den);\n }\n\n times(another: Fraction): Fraction {\n return new Fraction(this.num * another.num, this.den * another.den);\n }\n\n timesNum(another: number): Fraction {\n return new Fraction(this.num * another, this.den);\n }\n\n divby(another: Fraction): Fraction {\n return new Fraction(this.num * another.den, this.den * another.num);\n }\n\n divbyNum(another: number): Fraction {\n return new Fraction(this.num, this.den * another);\n }\n\n /**\n * Returns another / this.\n */\n numDivby(another: number): Fraction {\n return new Fraction(this.den * another, this.num);\n }\n\n /**\n * Returns this % another\n */\n mod(another: Fraction): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divby(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minus(another.timesNum(floorOfD));\n }\n\n /*\n * Returns this % another\n */\n modNum(another: number): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divbyNum(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minusNum(another * floorOfD);\n }\n\n get inverse(): Fraction {\n return new Fraction(this.den, this.num);\n }\n\n get factorized(): Fraction {\n const gcd = gcdof(this.num, this.den);\n return new Fraction(this.num / gcd, this.den / gcd);\n }\n\n equals(another: Fraction): boolean {\n return this.num * another.den == this.den * another.num;\n }\n\n equalsNum(another: number): boolean {\n return this.num == this.den * another;\n }\n\n cmp(another: Fraction): number {\n return this.num * another.den - this.den * another.num;\n }\n\n cmpNum(another: number): number {\n return this.num - this.den * another;\n }\n\n isLT(another: Fraction): boolean {\n return this.cmp(another) < 0;\n }\n\n isLTE(another: Fraction): boolean {\n return this.cmp(another) <= 0;\n }\n\n isLTNum(another: number): boolean {\n return this.cmpNum(another) < 0;\n }\n\n isLTENum(another: number): boolean {\n return this.cmpNum(another) <= 0;\n }\n\n isGT(another: Fraction): boolean {\n return this.cmp(another) > 0;\n }\n\n isGTE(another: Fraction): boolean {\n return this.cmp(another) >= 0;\n }\n\n isGTNum(another: number): boolean {\n return this.cmpNum(another) > 0;\n }\n\n isGTENum(another: number): boolean {\n return this.cmpNum(another) >= 0;\n }\n\n toString(): string {\n return this.num + \"/\" + this.den;\n }\n\n static max(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) > 0 ? f1 : f2;\n }\n\n static min(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) < 0 ? f1 : f2;\n }\n}\n\n// Shortcut helper\nexport const Frac = (a = 0, b = 1): Fraction => new Fraction(a, b);\n"]}
1
+ {"version":3,"file":"numberutils.js","sourceRoot":"","sources":["../../src/numberutils.ts"],"names":[],"mappings":";;;AAEA,SAAgB,KAAK,CAAC,KAAa,EAAE,MAAwB,IAAI,EAAE,OAAyB,CAAC;IAC3F,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM;YACL,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9C;KACF;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,IAAI,GAAG,CAAC,CAAC;KACV;IACD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,GAAG,EAAE;QACjB,IAAI,KAAK,GAAG,GAAG,EAAE;YACf,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;gBACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACb;SACF;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;gBACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACb;SACF;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AA3BD,sBA2BC;AAaD,SAAgB,KAAK,CAAC,CAAS,EAAE,CAAS;IACxC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,EAAE;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACV,CAAC,GAAG,CAAC,CAAC;KACP;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AATD,sBASC;AAED,MAAa,QAAQ;IAQnB,YAAY,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK;QAC9C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,mBAAmB,GAAG,GAAG,CAAC,CAAC;SACpE;QACD,IAAI,UAAU,EAAE;YACd,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5B,GAAG,IAAI,GAAG,CAAC;YACX,GAAG,IAAI,GAAG,CAAC;SACZ;QACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAW,EAAE,UAAU,GAAG,KAAK;QAC1C,MAAM,KAAK,GAAG,GAAG;aACd,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;SACpD;aAAM;YACL,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1B;YACD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1B;SACF;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;SACpD;QACD,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;SAC5B;aAAM;YACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SAC5C;IACH,CAAC;IAED,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;SAC5B;aAAM;YACL,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACxC;IACH,CAAC;IAED,IAAI,CAAC,OAAiB,EAAE,UAAU,GAAG,KAAK;QACxC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;QACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,OAAiB,EAAE,UAAU,GAAG,KAAK;QACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3G,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;QAC1C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,OAAiB,EAAE,UAAU,GAAG,KAAK;QACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClF,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;QAC1C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,OAAiB,EAAE,UAAU,GAAG,KAAK;QACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClF,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;QAC1C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAKD,QAAQ,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;QAC1C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAKD,GAAG,CAAC,OAAiB;QAEnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAKD,MAAM,CAAC,OAAe;QAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,UAAU;QACZ,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,OAAiB;QACtB,OAAO,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,OAAiB;QACnB,OAAO,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,OAAiB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAiB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,EAAY,EAAE,EAAY;QACnC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,EAAY,EAAE,EAAY;QACnC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;;AA3MH,4BA4MC;AAxMiB,aAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;AACtB,YAAG,GAAG,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,iBAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAyMzC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK,EAAY,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;AAAtF,QAAA,IAAI,QAAkF","sourcesContent":["import { Nullable } from \"./types\";\n\nexport function range(start: number, end: Nullable<number> = null, incr: Nullable<number> = 1): number[] {\n if (end == null) {\n const absStart = Math.abs(start);\n const arr = Array.from({ length: absStart });\n if (start >= 0) {\n return arr.map((x, i) => i);\n } else {\n return arr.map((x, i) => i - (absStart - 1));\n }\n }\n const out: number[] = [];\n if (incr == null) {\n incr = 1;\n }\n incr = Math.abs(incr);\n if (start !== end) {\n if (start < end) {\n for (let i = start; i <= end; i += incr) {\n out.push(i);\n }\n } else {\n for (let i = start; i >= end; i -= incr) {\n out.push(i);\n }\n }\n }\n return out;\n}\n\n/*\nexport function applyMixins(derivedCtor: any, baseCtors: any[]) {\n baseCtors.forEach(baseCtor => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {\n Object.defineProperty(derivedCtor.prototype, name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name));\n });\n });\n}\n*/\n\nexport function gcdof(x: number, y: number): number {\n x = Math.abs(x);\n y = Math.abs(y);\n while (y > 0) {\n const t = y;\n y = x % y;\n x = t;\n }\n return x;\n}\n\nexport class Fraction {\n readonly num: number;\n readonly den: number;\n\n static readonly ZERO = new Fraction();\n static readonly ONE = new Fraction(1, 1);\n static readonly INFINITY = new Fraction(1, 0);\n\n constructor(num = 0, den = 1, factorized = false) {\n if (isNaN(num) || isNaN(den)) {\n throw new Error(`Invalid numerator(${num}) or denminator(${den})`);\n }\n if (factorized) {\n const gcd = gcdof(num, den);\n num /= gcd;\n den /= gcd;\n }\n this.num = num;\n this.den = den;\n }\n\n static parse(val: string, factorized = false): Fraction {\n const parts = val\n .trim()\n .split(\"/\")\n .map((x) => x.trim());\n let num = 1;\n let den = 1;\n if (parts.length == 1) num = parseInt(parts[0]);\n else if (parts.length != 2) {\n throw new Error(\"Invalid fraction string: \" + val);\n } else {\n if (parts[0].length > 0) {\n num = parseInt(parts[0]);\n }\n if (parts[1].length > 0) {\n den = parseInt(parts[1]);\n }\n }\n if (isNaN(num) || isNaN(den)) {\n throw new Error(\"Invalid fraction string: \" + val);\n }\n return new Fraction(num, den, factorized);\n }\n\n get isWhole(): boolean {\n return this.num % this.den == 0;\n }\n\n get isZero(): boolean {\n return this.num == 0;\n }\n\n get isInfinity(): boolean {\n return this.den == 0;\n }\n\n get isOne(): boolean {\n return this.num == this.den;\n }\n\n get ceil(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return 1 + Math.floor(this.num / this.den);\n }\n }\n\n get floor(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return Math.floor(this.num / this.den);\n }\n }\n\n plus(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den, factorized);\n }\n\n plusNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num + this.den * another, this.den, factorized);\n }\n\n minus(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den, factorized);\n }\n\n minusNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num - this.den * another, this.den, factorized);\n }\n\n times(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.num, this.den * another.den, factorized);\n }\n\n timesNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num * another, this.den, factorized);\n }\n\n divby(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.den, this.den * another.num, factorized);\n }\n\n divbyNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num, this.den * another, factorized);\n }\n\n /**\n * Returns another / this.\n */\n numDivby(another: number, factorized = false): Fraction {\n return new Fraction(this.den * another, this.num, factorized);\n }\n\n /**\n * Returns this % another\n */\n mod(another: Fraction): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divby(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minus(another.timesNum(floorOfD));\n }\n\n /*\n * Returns this % another\n */\n modNum(another: number): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divbyNum(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minusNum(another * floorOfD);\n }\n\n get inverse(): Fraction {\n return new Fraction(this.den, this.num);\n }\n\n get factorized(): Fraction {\n const gcd = gcdof(this.num, this.den);\n return new Fraction(this.num / gcd, this.den / gcd);\n }\n\n equals(another: Fraction): boolean {\n return this.num * another.den == this.den * another.num;\n }\n\n equalsNum(another: number): boolean {\n return this.num == this.den * another;\n }\n\n cmp(another: Fraction): number {\n return this.num * another.den - this.den * another.num;\n }\n\n cmpNum(another: number): number {\n return this.num - this.den * another;\n }\n\n isLT(another: Fraction): boolean {\n return this.cmp(another) < 0;\n }\n\n isLTE(another: Fraction): boolean {\n return this.cmp(another) <= 0;\n }\n\n isLTNum(another: number): boolean {\n return this.cmpNum(another) < 0;\n }\n\n isLTENum(another: number): boolean {\n return this.cmpNum(another) <= 0;\n }\n\n isGT(another: Fraction): boolean {\n return this.cmp(another) > 0;\n }\n\n isGTE(another: Fraction): boolean {\n return this.cmp(another) >= 0;\n }\n\n isGTNum(another: number): boolean {\n return this.cmpNum(another) > 0;\n }\n\n isGTENum(another: number): boolean {\n return this.cmpNum(another) >= 0;\n }\n\n toString(): string {\n return this.num + \"/\" + this.den;\n }\n\n static max(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) > 0 ? f1 : f2;\n }\n\n static min(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) < 0 ? f1 : f2;\n }\n}\n\n// Shortcut helper\nexport const Frac = (a = 0, b = 1, factorized = false): Fraction => new Fraction(a, b, factorized);\n"]}
package/lib/esm/dal.d.ts CHANGED
@@ -11,7 +11,7 @@ export declare class Resource extends BaseEntity {
11
11
  visibility: "public" | "private" | "limited";
12
12
  visibleTo: string[];
13
13
  constructor(config?: any);
14
- isVisibleTo(userId: string): boolean;
14
+ isVisibleTo(userId: string | null): boolean;
15
15
  get version(): number;
16
16
  get hasKey(): boolean;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dal.js","sourceRoot":"","sources":["../../src/dal.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IAKrB,YAAY,MAAY;QACtB,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,UAAU;IAatC,YAAY,MAAY;QACtB,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC9D,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,CAAC,CAAC;IACX,CAAC;IAGD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;CACF","sourcesContent":["import { Timestamp } from \"./types\";\n\nexport class BaseEntity {\n isActive: boolean;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n\n constructor(config?: any) {\n config = config || {};\n this.isActive = config.isActive == false ? false : true;\n this.createdAt = config.createdAt || Date.now();\n this.updatedAt = config.updatedAt || Date.now();\n }\n}\n\nexport class Resource extends BaseEntity {\n // Collection ID\n id: string;\n\n // Owner/Creator of this collection\n userId: string;\n\n // Visibility status\n visibility: \"public\" | \"private\" | \"limited\";\n\n // Who can see this score\n visibleTo: string[];\n\n constructor(config?: any) {\n super((config = config || {}));\n this.id = \"\" + (config.id || \"\");\n this.userId = \"\" + (config.userId || \"\");\n this.visibleTo = config.visibleTo || [];\n this.visibility = (config.visibility || \"private\").toLowerCase();\n }\n\n isVisibleTo(userId: string): boolean {\n return this.userId == userId || this.visibility == \"public\";\n }\n\n // TODO - move this to schema and/or decorators\n get version(): number {\n return 0;\n }\n\n // And others things here\n get hasKey(): boolean {\n return this.id.trim().length > 0;\n }\n}\n"]}
1
+ {"version":3,"file":"dal.js","sourceRoot":"","sources":["../../src/dal.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IAKrB,YAAY,MAAY;QACtB,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,UAAU;IAatC,YAAY,MAAY;QACtB,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IAED,WAAW,CAAC,MAAqB;QAC/B,OAAO,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC9D,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,CAAC,CAAC;IACX,CAAC;IAGD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;CACF","sourcesContent":["import { Timestamp } from \"./types\";\n\nexport class BaseEntity {\n isActive: boolean;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n\n constructor(config?: any) {\n config = config || {};\n this.isActive = config.isActive == false ? false : true;\n this.createdAt = config.createdAt || Date.now();\n this.updatedAt = config.updatedAt || Date.now();\n }\n}\n\nexport class Resource extends BaseEntity {\n // Collection ID\n id: string;\n\n // Owner/Creator of this collection\n userId: string;\n\n // Visibility status\n visibility: \"public\" | \"private\" | \"limited\";\n\n // Who can see this score\n visibleTo: string[];\n\n constructor(config?: any) {\n super((config = config || {}));\n this.id = \"\" + (config.id || \"\");\n this.userId = \"\" + (config.userId || \"\");\n this.visibleTo = config.visibleTo || [];\n this.visibility = (config.visibility || \"private\").toLowerCase();\n }\n\n isVisibleTo(userId: string | null): boolean {\n return this.userId == userId || this.visibility == \"public\";\n }\n\n // TODO - move this to schema and/or decorators\n get version(): number {\n return 0;\n }\n\n // And others things here\n get hasKey(): boolean {\n return this.id.trim().length > 0;\n }\n}\n"]}
@@ -7,22 +7,23 @@ export declare class Fraction {
7
7
  static readonly ZERO: Fraction;
8
8
  static readonly ONE: Fraction;
9
9
  static readonly INFINITY: Fraction;
10
- constructor(num?: number, den?: number);
10
+ constructor(num?: number, den?: number, factorized?: boolean);
11
+ static parse(val: string, factorized?: boolean): Fraction;
11
12
  get isWhole(): boolean;
12
13
  get isZero(): boolean;
13
14
  get isInfinity(): boolean;
14
15
  get isOne(): boolean;
15
16
  get ceil(): number;
16
17
  get floor(): number;
17
- plus(another: Fraction): Fraction;
18
- plusNum(another: number): Fraction;
19
- minus(another: Fraction): Fraction;
20
- minusNum(another: number): Fraction;
21
- times(another: Fraction): Fraction;
22
- timesNum(another: number): Fraction;
23
- divby(another: Fraction): Fraction;
24
- divbyNum(another: number): Fraction;
25
- numDivby(another: number): Fraction;
18
+ plus(another: Fraction, factorized?: boolean): Fraction;
19
+ plusNum(another: number, factorized?: boolean): Fraction;
20
+ minus(another: Fraction, factorized?: boolean): Fraction;
21
+ minusNum(another: number, factorized?: boolean): Fraction;
22
+ times(another: Fraction, factorized?: boolean): Fraction;
23
+ timesNum(another: number, factorized?: boolean): Fraction;
24
+ divby(another: Fraction, factorized?: boolean): Fraction;
25
+ divbyNum(another: number, factorized?: boolean): Fraction;
26
+ numDivby(another: number, factorized?: boolean): Fraction;
26
27
  mod(another: Fraction): Fraction;
27
28
  modNum(another: number): Fraction;
28
29
  get inverse(): Fraction;
@@ -43,4 +44,4 @@ export declare class Fraction {
43
44
  static max(f1: Fraction, f2: Fraction): Fraction;
44
45
  static min(f1: Fraction, f2: Fraction): Fraction;
45
46
  }
46
- export declare const Frac: (a?: number, b?: number) => Fraction;
47
+ export declare const Frac: (a?: number, b?: number, factorized?: boolean) => Fraction;
@@ -39,13 +39,43 @@ export function gcdof(x, y) {
39
39
  return x;
40
40
  }
41
41
  export class Fraction {
42
- constructor(num = 0, den = 1) {
42
+ constructor(num = 0, den = 1, factorized = false) {
43
43
  if (isNaN(num) || isNaN(den)) {
44
- throw new Error("Invalid numerator or denminator");
44
+ throw new Error(`Invalid numerator(${num}) or denminator(${den})`);
45
+ }
46
+ if (factorized) {
47
+ const gcd = gcdof(num, den);
48
+ num /= gcd;
49
+ den /= gcd;
45
50
  }
46
51
  this.num = num;
47
52
  this.den = den;
48
53
  }
54
+ static parse(val, factorized = false) {
55
+ const parts = val
56
+ .trim()
57
+ .split("/")
58
+ .map((x) => x.trim());
59
+ let num = 1;
60
+ let den = 1;
61
+ if (parts.length == 1)
62
+ num = parseInt(parts[0]);
63
+ else if (parts.length != 2) {
64
+ throw new Error("Invalid fraction string: " + val);
65
+ }
66
+ else {
67
+ if (parts[0].length > 0) {
68
+ num = parseInt(parts[0]);
69
+ }
70
+ if (parts[1].length > 0) {
71
+ den = parseInt(parts[1]);
72
+ }
73
+ }
74
+ if (isNaN(num) || isNaN(den)) {
75
+ throw new Error("Invalid fraction string: " + val);
76
+ }
77
+ return new Fraction(num, den, factorized);
78
+ }
49
79
  get isWhole() {
50
80
  return this.num % this.den == 0;
51
81
  }
@@ -74,32 +104,32 @@ export class Fraction {
74
104
  return Math.floor(this.num / this.den);
75
105
  }
76
106
  }
77
- plus(another) {
78
- return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den);
107
+ plus(another, factorized = false) {
108
+ return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den, factorized);
79
109
  }
80
- plusNum(another) {
81
- return new Fraction(this.num + this.den * another, this.den);
110
+ plusNum(another, factorized = false) {
111
+ return new Fraction(this.num + this.den * another, this.den, factorized);
82
112
  }
83
- minus(another) {
84
- return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den);
113
+ minus(another, factorized = false) {
114
+ return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den, factorized);
85
115
  }
86
- minusNum(another) {
87
- return new Fraction(this.num - this.den * another, this.den);
116
+ minusNum(another, factorized = false) {
117
+ return new Fraction(this.num - this.den * another, this.den, factorized);
88
118
  }
89
- times(another) {
90
- return new Fraction(this.num * another.num, this.den * another.den);
119
+ times(another, factorized = false) {
120
+ return new Fraction(this.num * another.num, this.den * another.den, factorized);
91
121
  }
92
- timesNum(another) {
93
- return new Fraction(this.num * another, this.den);
122
+ timesNum(another, factorized = false) {
123
+ return new Fraction(this.num * another, this.den, factorized);
94
124
  }
95
- divby(another) {
96
- return new Fraction(this.num * another.den, this.den * another.num);
125
+ divby(another, factorized = false) {
126
+ return new Fraction(this.num * another.den, this.den * another.num, factorized);
97
127
  }
98
- divbyNum(another) {
99
- return new Fraction(this.num, this.den * another);
128
+ divbyNum(another, factorized = false) {
129
+ return new Fraction(this.num, this.den * another, factorized);
100
130
  }
101
- numDivby(another) {
102
- return new Fraction(this.den * another, this.num);
131
+ numDivby(another, factorized = false) {
132
+ return new Fraction(this.den * another, this.num, factorized);
103
133
  }
104
134
  mod(another) {
105
135
  const d = this.divby(another);
@@ -167,5 +197,5 @@ export class Fraction {
167
197
  Fraction.ZERO = new Fraction();
168
198
  Fraction.ONE = new Fraction(1, 1);
169
199
  Fraction.INFINITY = new Fraction(1, 0);
170
- export const Frac = (a = 0, b = 1) => new Fraction(a, b);
200
+ export const Frac = (a = 0, b = 1, factorized = false) => new Fraction(a, b, factorized);
171
201
  //# sourceMappingURL=numberutils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"numberutils.js","sourceRoot":"","sources":["../../src/numberutils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,MAAwB,IAAI,EAAE,OAAyB,CAAC;IAC3F,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM;YACL,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9C;KACF;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,IAAI,GAAG,CAAC,CAAC;KACV;IACD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,GAAG,EAAE;QACjB,IAAI,KAAK,GAAG,GAAG,EAAE;YACf,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;gBACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACb;SACF;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;gBACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACb;SACF;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAaD,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,CAAS;IACxC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,EAAE;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACV,CAAC,GAAG,CAAC,CAAC;KACP;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,QAAQ;IAQnB,YAAY,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;QAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACpD;QACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;SAC5B;aAAM;YACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SAC5C;IACH,CAAC;IAED,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;SAC5B;aAAM;YACL,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACxC;IACH,CAAC;IAED,IAAI,CAAC,OAAiB;QACpB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/F,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;IACpD,CAAC;IAKD,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAKD,GAAG,CAAC,OAAiB;QAEnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAKD,MAAM,CAAC,OAAe;QAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,UAAU;QACZ,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,OAAiB;QACtB,OAAO,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,OAAiB;QACnB,OAAO,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,OAAiB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAiB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAiB;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,EAAY,EAAE,EAAY;QACnC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,EAAY,EAAE,EAAY;QACnC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;;AA1Ke,aAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;AACtB,YAAG,GAAG,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,iBAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AA4KhD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAY,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC","sourcesContent":["import { Nullable } from \"./types\";\n\nexport function range(start: number, end: Nullable<number> = null, incr: Nullable<number> = 1): number[] {\n if (end == null) {\n const absStart = Math.abs(start);\n const arr = Array.from({ length: absStart });\n if (start >= 0) {\n return arr.map((x, i) => i);\n } else {\n return arr.map((x, i) => i - (absStart - 1));\n }\n }\n const out: number[] = [];\n if (incr == null) {\n incr = 1;\n }\n incr = Math.abs(incr);\n if (start !== end) {\n if (start < end) {\n for (let i = start; i <= end; i += incr) {\n out.push(i);\n }\n } else {\n for (let i = start; i >= end; i -= incr) {\n out.push(i);\n }\n }\n }\n return out;\n}\n\n/*\nexport function applyMixins(derivedCtor: any, baseCtors: any[]) {\n baseCtors.forEach(baseCtor => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {\n Object.defineProperty(derivedCtor.prototype, name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name));\n });\n });\n}\n*/\n\nexport function gcdof(x: number, y: number): number {\n x = Math.abs(x);\n y = Math.abs(y);\n while (y > 0) {\n const t = y;\n y = x % y;\n x = t;\n }\n return x;\n}\n\nexport class Fraction {\n readonly num: number;\n readonly den: number;\n\n static readonly ZERO = new Fraction();\n static readonly ONE = new Fraction(1, 1);\n static readonly INFINITY = new Fraction(1, 0);\n\n constructor(num = 0, den = 1) {\n if (isNaN(num) || isNaN(den)) {\n throw new Error(\"Invalid numerator or denminator\");\n }\n this.num = num;\n this.den = den;\n }\n\n get isWhole(): boolean {\n return this.num % this.den == 0;\n }\n\n get isZero(): boolean {\n return this.num == 0;\n }\n\n get isInfinity(): boolean {\n return this.den == 0;\n }\n\n get isOne(): boolean {\n return this.num == this.den;\n }\n\n get ceil(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return 1 + Math.floor(this.num / this.den);\n }\n }\n\n get floor(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return Math.floor(this.num / this.den);\n }\n }\n\n plus(another: Fraction): Fraction {\n return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den);\n }\n\n plusNum(another: number): Fraction {\n return new Fraction(this.num + this.den * another, this.den);\n }\n\n minus(another: Fraction): Fraction {\n return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den);\n }\n\n minusNum(another: number): Fraction {\n return new Fraction(this.num - this.den * another, this.den);\n }\n\n times(another: Fraction): Fraction {\n return new Fraction(this.num * another.num, this.den * another.den);\n }\n\n timesNum(another: number): Fraction {\n return new Fraction(this.num * another, this.den);\n }\n\n divby(another: Fraction): Fraction {\n return new Fraction(this.num * another.den, this.den * another.num);\n }\n\n divbyNum(another: number): Fraction {\n return new Fraction(this.num, this.den * another);\n }\n\n /**\n * Returns another / this.\n */\n numDivby(another: number): Fraction {\n return new Fraction(this.den * another, this.num);\n }\n\n /**\n * Returns this % another\n */\n mod(another: Fraction): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divby(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minus(another.timesNum(floorOfD));\n }\n\n /*\n * Returns this % another\n */\n modNum(another: number): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divbyNum(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minusNum(another * floorOfD);\n }\n\n get inverse(): Fraction {\n return new Fraction(this.den, this.num);\n }\n\n get factorized(): Fraction {\n const gcd = gcdof(this.num, this.den);\n return new Fraction(this.num / gcd, this.den / gcd);\n }\n\n equals(another: Fraction): boolean {\n return this.num * another.den == this.den * another.num;\n }\n\n equalsNum(another: number): boolean {\n return this.num == this.den * another;\n }\n\n cmp(another: Fraction): number {\n return this.num * another.den - this.den * another.num;\n }\n\n cmpNum(another: number): number {\n return this.num - this.den * another;\n }\n\n isLT(another: Fraction): boolean {\n return this.cmp(another) < 0;\n }\n\n isLTE(another: Fraction): boolean {\n return this.cmp(another) <= 0;\n }\n\n isLTNum(another: number): boolean {\n return this.cmpNum(another) < 0;\n }\n\n isLTENum(another: number): boolean {\n return this.cmpNum(another) <= 0;\n }\n\n isGT(another: Fraction): boolean {\n return this.cmp(another) > 0;\n }\n\n isGTE(another: Fraction): boolean {\n return this.cmp(another) >= 0;\n }\n\n isGTNum(another: number): boolean {\n return this.cmpNum(another) > 0;\n }\n\n isGTENum(another: number): boolean {\n return this.cmpNum(another) >= 0;\n }\n\n toString(): string {\n return this.num + \"/\" + this.den;\n }\n\n static max(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) > 0 ? f1 : f2;\n }\n\n static min(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) < 0 ? f1 : f2;\n }\n}\n\n// Shortcut helper\nexport const Frac = (a = 0, b = 1): Fraction => new Fraction(a, b);\n"]}
1
+ {"version":3,"file":"numberutils.js","sourceRoot":"","sources":["../../src/numberutils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"./types\";\n\nexport function range(start: number, end: Nullable<number> = null, incr: Nullable<number> = 1): number[] {\n if (end == null) {\n const absStart = Math.abs(start);\n const arr = Array.from({ length: absStart });\n if (start >= 0) {\n return arr.map((x, i) => i);\n } else {\n return arr.map((x, i) => i - (absStart - 1));\n }\n }\n const out: number[] = [];\n if (incr == null) {\n incr = 1;\n }\n incr = Math.abs(incr);\n if (start !== end) {\n if (start < end) {\n for (let i = start; i <= end; i += incr) {\n out.push(i);\n }\n } else {\n for (let i = start; i >= end; i -= incr) {\n out.push(i);\n }\n }\n }\n return out;\n}\n\n/*\nexport function applyMixins(derivedCtor: any, baseCtors: any[]) {\n baseCtors.forEach(baseCtor => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {\n Object.defineProperty(derivedCtor.prototype, name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name));\n });\n });\n}\n*/\n\nexport function gcdof(x: number, y: number): number {\n x = Math.abs(x);\n y = Math.abs(y);\n while (y > 0) {\n const t = y;\n y = x % y;\n x = t;\n }\n return x;\n}\n\nexport class Fraction {\n readonly num: number;\n readonly den: number;\n\n static readonly ZERO = new Fraction();\n static readonly ONE = new Fraction(1, 1);\n static readonly INFINITY = new Fraction(1, 0);\n\n constructor(num = 0, den = 1, factorized = false) {\n if (isNaN(num) || isNaN(den)) {\n throw new Error(`Invalid numerator(${num}) or denminator(${den})`);\n }\n if (factorized) {\n const gcd = gcdof(num, den);\n num /= gcd;\n den /= gcd;\n }\n this.num = num;\n this.den = den;\n }\n\n static parse(val: string, factorized = false): Fraction {\n const parts = val\n .trim()\n .split(\"/\")\n .map((x) => x.trim());\n let num = 1;\n let den = 1;\n if (parts.length == 1) num = parseInt(parts[0]);\n else if (parts.length != 2) {\n throw new Error(\"Invalid fraction string: \" + val);\n } else {\n if (parts[0].length > 0) {\n num = parseInt(parts[0]);\n }\n if (parts[1].length > 0) {\n den = parseInt(parts[1]);\n }\n }\n if (isNaN(num) || isNaN(den)) {\n throw new Error(\"Invalid fraction string: \" + val);\n }\n return new Fraction(num, den, factorized);\n }\n\n get isWhole(): boolean {\n return this.num % this.den == 0;\n }\n\n get isZero(): boolean {\n return this.num == 0;\n }\n\n get isInfinity(): boolean {\n return this.den == 0;\n }\n\n get isOne(): boolean {\n return this.num == this.den;\n }\n\n get ceil(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return 1 + Math.floor(this.num / this.den);\n }\n }\n\n get floor(): number {\n if (this.num % this.den == 0) {\n return this.num / this.den;\n } else {\n return Math.floor(this.num / this.den);\n }\n }\n\n plus(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.den + this.den * another.num, this.den * another.den, factorized);\n }\n\n plusNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num + this.den * another, this.den, factorized);\n }\n\n minus(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.den - this.den * another.num, this.den * another.den, factorized);\n }\n\n minusNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num - this.den * another, this.den, factorized);\n }\n\n times(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.num, this.den * another.den, factorized);\n }\n\n timesNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num * another, this.den, factorized);\n }\n\n divby(another: Fraction, factorized = false): Fraction {\n return new Fraction(this.num * another.den, this.den * another.num, factorized);\n }\n\n divbyNum(another: number, factorized = false): Fraction {\n return new Fraction(this.num, this.den * another, factorized);\n }\n\n /**\n * Returns another / this.\n */\n numDivby(another: number, factorized = false): Fraction {\n return new Fraction(this.den * another, this.num, factorized);\n }\n\n /**\n * Returns this % another\n */\n mod(another: Fraction): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divby(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minus(another.timesNum(floorOfD));\n }\n\n /*\n * Returns this % another\n */\n modNum(another: number): Fraction {\n // a (mod b) = a − b ⌊a / b⌋\n const d = this.divbyNum(another);\n const floorOfD = Math.floor(d.num / d.den);\n return this.minusNum(another * floorOfD);\n }\n\n get inverse(): Fraction {\n return new Fraction(this.den, this.num);\n }\n\n get factorized(): Fraction {\n const gcd = gcdof(this.num, this.den);\n return new Fraction(this.num / gcd, this.den / gcd);\n }\n\n equals(another: Fraction): boolean {\n return this.num * another.den == this.den * another.num;\n }\n\n equalsNum(another: number): boolean {\n return this.num == this.den * another;\n }\n\n cmp(another: Fraction): number {\n return this.num * another.den - this.den * another.num;\n }\n\n cmpNum(another: number): number {\n return this.num - this.den * another;\n }\n\n isLT(another: Fraction): boolean {\n return this.cmp(another) < 0;\n }\n\n isLTE(another: Fraction): boolean {\n return this.cmp(another) <= 0;\n }\n\n isLTNum(another: number): boolean {\n return this.cmpNum(another) < 0;\n }\n\n isLTENum(another: number): boolean {\n return this.cmpNum(another) <= 0;\n }\n\n isGT(another: Fraction): boolean {\n return this.cmp(another) > 0;\n }\n\n isGTE(another: Fraction): boolean {\n return this.cmp(another) >= 0;\n }\n\n isGTNum(another: number): boolean {\n return this.cmpNum(another) > 0;\n }\n\n isGTENum(another: number): boolean {\n return this.cmpNum(another) >= 0;\n }\n\n toString(): string {\n return this.num + \"/\" + this.den;\n }\n\n static max(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) > 0 ? f1 : f2;\n }\n\n static min(f1: Fraction, f2: Fraction): Fraction {\n return f1.cmp(f2) < 0 ? f1 : f2;\n }\n}\n\n// Shortcut helper\nexport const Frac = (a = 0, b = 1, factorized = false): Fraction => new Fraction(a, b, factorized);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panyam/tsutils",
3
- "version": "0.0.55",
3
+ "version": "0.0.60",
4
4
  "author": "Sriram Panyam",
5
5
  "description": "Some basic TS utils for personal use",
6
6
  "homepage": "https://github.com/panyam/tsutils#readme",