pythonlib 0.1.0 → 0.2.0

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.
Files changed (64) hide show
  1. package/README.md +41 -138
  2. package/dist/{chunk-3CSEXTA7.js → chunk-4QG3772L.js} +53 -53
  3. package/dist/chunk-4QG3772L.js.map +1 -0
  4. package/dist/{chunk-OMQNGE6T.js → chunk-4SZT4HJI.js} +32 -27
  5. package/dist/chunk-4SZT4HJI.js.map +1 -0
  6. package/dist/{chunk-IVYYI2VR.js → chunk-6POEDI34.js} +1 -1
  7. package/dist/chunk-6POEDI34.js.map +1 -0
  8. package/dist/{chunk-P3SGIF72.js → chunk-6VQ7ITWO.js} +6 -6
  9. package/dist/chunk-6VQ7ITWO.js.map +1 -0
  10. package/dist/{chunk-V63LKSA3.js → chunk-7TH4FCVQ.js} +24 -24
  11. package/dist/chunk-7TH4FCVQ.js.map +1 -0
  12. package/dist/{chunk-TJFGYXBJ.js → chunk-BDBX5BG4.js} +63 -61
  13. package/dist/chunk-BDBX5BG4.js.map +1 -0
  14. package/dist/{chunk-WAONBJE5.js → chunk-H76SKASU.js} +36 -36
  15. package/dist/chunk-H76SKASU.js.map +1 -0
  16. package/dist/{chunk-TOI6IG3T.js → chunk-HQ42WNKZ.js} +43 -16
  17. package/dist/chunk-HQ42WNKZ.js.map +1 -0
  18. package/dist/{chunk-HA5Y7PKO.js → chunk-KRRY534Q.js} +36 -35
  19. package/dist/chunk-KRRY534Q.js.map +1 -0
  20. package/dist/{chunk-UFMTN4T4.js → chunk-XGT3VOIZ.js} +5 -5
  21. package/dist/chunk-XGT3VOIZ.js.map +1 -0
  22. package/dist/{collections-xN9Gi0TA.d.ts → collections-CJur5Wg-.d.ts} +5 -3
  23. package/dist/collections.d.ts +1 -1
  24. package/dist/collections.js +1 -1
  25. package/dist/{datetime-DRwFAiGV.d.ts → datetime-Bpce8gG2.d.ts} +17 -15
  26. package/dist/datetime.d.ts +1 -1
  27. package/dist/datetime.js +1 -1
  28. package/dist/{functools-St5GqpKG.d.ts → functools-NrsZAqJk.d.ts} +42 -26
  29. package/dist/functools.d.ts +1 -1
  30. package/dist/functools.js +19 -17
  31. package/dist/index.d.ts +56 -158
  32. package/dist/index.js +45 -137
  33. package/dist/index.js.map +1 -1
  34. package/dist/{itertools-Bj8XivI6.d.ts → itertools-Sjl1LB_0.d.ts} +35 -17
  35. package/dist/itertools.d.ts +1 -1
  36. package/dist/itertools.js +15 -11
  37. package/dist/{json-Xpk0kwSd.d.ts → json-DAlvCadU.d.ts} +7 -5
  38. package/dist/json.d.ts +1 -1
  39. package/dist/json.js +1 -1
  40. package/dist/{math-BrT4Aw3E.d.ts → math-DwEGjjQ-.d.ts} +2 -0
  41. package/dist/math.d.ts +1 -1
  42. package/dist/math.js +1 -1
  43. package/dist/{os-FRSJbEUH.d.ts → os-C6Nt7Ijx.d.ts} +45 -42
  44. package/dist/os.d.ts +1 -1
  45. package/dist/os.js +23 -23
  46. package/dist/{random-D5S5iSV3.d.ts → random-BJv_rSpL.d.ts} +24 -22
  47. package/dist/random.d.ts +1 -1
  48. package/dist/random.js +21 -21
  49. package/dist/{re-DSxiURqN.d.ts → re-B1CHCgyr.d.ts} +17 -15
  50. package/dist/re.d.ts +1 -1
  51. package/dist/re.js +7 -7
  52. package/dist/string.d.ts +51 -48
  53. package/dist/string.js +13 -13
  54. package/package.json +20 -3
  55. package/dist/chunk-3CSEXTA7.js.map +0 -1
  56. package/dist/chunk-HA5Y7PKO.js.map +0 -1
  57. package/dist/chunk-IVYYI2VR.js.map +0 -1
  58. package/dist/chunk-OMQNGE6T.js.map +0 -1
  59. package/dist/chunk-P3SGIF72.js.map +0 -1
  60. package/dist/chunk-TJFGYXBJ.js.map +0 -1
  61. package/dist/chunk-TOI6IG3T.js.map +0 -1
  62. package/dist/chunk-UFMTN4T4.js.map +0 -1
  63. package/dist/chunk-V63LKSA3.js.map +0 -1
  64. package/dist/chunk-WAONBJE5.js.map +0 -1
package/dist/string.d.ts CHANGED
@@ -1,19 +1,22 @@
1
1
  /**
2
- * Python string methods and constants for TypeScript
3
- * Usage: py.string.join(), py.string.split(), py.string.ascii_lowercase, etc.
2
+ * Python string module for TypeScript
3
+ *
4
+ * Provides string constants and utility classes matching Python's string module.
5
+ *
6
+ * @see {@link https://docs.python.org/3/library/string.html | Python string documentation}
4
7
  */
5
8
  /** The lowercase letters 'abcdefghijklmnopqrstuvwxyz' */
6
- declare const ascii_lowercase = "abcdefghijklmnopqrstuvwxyz";
9
+ declare const asciiLowercase = "abcdefghijklmnopqrstuvwxyz";
7
10
  /** The uppercase letters 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' */
8
- declare const ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
9
- /** The concatenation of ascii_lowercase and ascii_uppercase */
10
- declare const ascii_letters: string;
11
+ declare const asciiUppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
12
+ /** The concatenation of asciiLowercase and asciiUppercase */
13
+ declare const asciiLetters: string;
11
14
  /** The string '0123456789' */
12
15
  declare const digits = "0123456789";
13
16
  /** The string '0123456789abcdefABCDEF' */
14
- declare const hexdigits = "0123456789abcdefABCDEF";
17
+ declare const hexDigits = "0123456789abcdefABCDEF";
15
18
  /** The string '01234567' */
16
- declare const octdigits = "01234567";
19
+ declare const octDigits = "01234567";
17
20
  /** String of ASCII characters which are considered punctuation */
18
21
  declare const punctuation = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
19
22
  /** String of ASCII characters which are considered whitespace */
@@ -26,12 +29,12 @@ declare class Template {
26
29
  /** Perform substitution, raising KeyError for missing keys */
27
30
  substitute(mapping?: Record<string, unknown>): string;
28
31
  /** Perform substitution, returning original placeholder for missing keys */
29
- safe_substitute(mapping?: Record<string, unknown>): string;
32
+ safeSubstitute(mapping?: Record<string, unknown>): string;
30
33
  /** Get identifiers in template */
31
- get_identifiers(): string[];
34
+ getIdentifiers(): string[];
32
35
  }
33
36
  /** Capitalize words in string */
34
- declare function capwords(s: string, sep?: string): string;
37
+ declare function capWords(s: string, sep?: string): string;
35
38
  declare const string: {
36
39
  /**
37
40
  * Python str.join()
@@ -42,21 +45,21 @@ declare const string: {
42
45
  */
43
46
  split(s: string, sep?: string, maxsplit?: number): string[];
44
47
  /**
45
- * Python str.rsplit()
48
+ * Python str.rSplit()
46
49
  */
47
- rsplit(s: string, sep?: string, maxsplit?: number): string[];
50
+ rSplit(s: string, sep?: string, maxsplit?: number): string[];
48
51
  /**
49
52
  * Python str.strip()
50
53
  */
51
54
  strip(s: string, chars?: string): string;
52
55
  /**
53
- * Python str.lstrip()
56
+ * Python str.lStrip()
54
57
  */
55
- lstrip(s: string, chars?: string): string;
58
+ lStrip(s: string, chars?: string): string;
56
59
  /**
57
- * Python str.rstrip()
60
+ * Python str.rStrip()
58
61
  */
59
- rstrip(s: string, chars?: string): string;
62
+ rStrip(s: string, chars?: string): string;
60
63
  /**
61
64
  * Python str.upper()
62
65
  */
@@ -74,33 +77,33 @@ declare const string: {
74
77
  */
75
78
  title(s: string): string;
76
79
  /**
77
- * Python str.swapcase()
80
+ * Python str.swapCase()
78
81
  */
79
- swapcase(s: string): string;
82
+ swapCase(s: string): string;
80
83
  /**
81
- * Python str.startswith()
84
+ * Python str.startsWith()
82
85
  */
83
- startswith(s: string, prefix: string, start?: number, end?: number): boolean;
86
+ startsWith(s: string, prefix: string, start?: number, end?: number): boolean;
84
87
  /**
85
- * Python str.endswith()
88
+ * Python str.endsWith()
86
89
  */
87
- endswith(s: string, suffix: string, start?: number, end?: number): boolean;
90
+ endsWith(s: string, suffix: string, start?: number, end?: number): boolean;
88
91
  /**
89
92
  * Python str.find()
90
93
  */
91
94
  find(s: string, sub: string, start?: number, end?: number): number;
92
95
  /**
93
- * Python str.rfind()
96
+ * Python str.rFind()
94
97
  */
95
- rfind(s: string, sub: string, start?: number, end?: number): number;
98
+ rFind(s: string, sub: string, start?: number, end?: number): number;
96
99
  /**
97
100
  * Python str.index() - raises error if not found
98
101
  */
99
102
  index(s: string, sub: string, start?: number, end?: number): number;
100
103
  /**
101
- * Python str.rindex() - raises error if not found
104
+ * Python str.rIndex() - raises error if not found
102
105
  */
103
- rindex(s: string, sub: string, start?: number, end?: number): number;
106
+ rIndex(s: string, sub: string, start?: number, end?: number): number;
104
107
  /**
105
108
  * Python str.count()
106
109
  */
@@ -110,57 +113,57 @@ declare const string: {
110
113
  */
111
114
  replace(s: string, old: string, newStr: string, count?: number): string;
112
115
  /**
113
- * Python str.zfill()
116
+ * Python str.zFill()
114
117
  */
115
- zfill(s: string, width: number): string;
118
+ zFill(s: string, width: number): string;
116
119
  /**
117
120
  * Python str.center()
118
121
  */
119
122
  center(s: string, width: number, fillchar?: string): string;
120
123
  /**
121
- * Python str.ljust()
124
+ * Python str.lJust()
122
125
  */
123
- ljust(s: string, width: number, fillchar?: string): string;
126
+ lJust(s: string, width: number, fillchar?: string): string;
124
127
  /**
125
- * Python str.rjust()
128
+ * Python str.rJust()
126
129
  */
127
- rjust(s: string, width: number, fillchar?: string): string;
130
+ rJust(s: string, width: number, fillchar?: string): string;
128
131
  /**
129
132
  * Python str.partition()
130
133
  */
131
134
  partition(s: string, sep: string): [string, string, string];
132
135
  /**
133
- * Python str.rpartition()
136
+ * Python str.rPartition()
134
137
  */
135
- rpartition(s: string, sep: string): [string, string, string];
138
+ rPartition(s: string, sep: string): [string, string, string];
136
139
  /**
137
- * Python str.isalpha()
140
+ * Python str.isAlpha()
138
141
  */
139
- isalpha(s: string): boolean;
142
+ isAlpha(s: string): boolean;
140
143
  /**
141
- * Python str.isdigit()
144
+ * Python str.isDigit()
142
145
  */
143
- isdigit(s: string): boolean;
146
+ isDigit(s: string): boolean;
144
147
  /**
145
- * Python str.isalnum()
148
+ * Python str.isAlnum()
146
149
  */
147
- isalnum(s: string): boolean;
150
+ isAlnum(s: string): boolean;
148
151
  /**
149
- * Python str.isspace()
152
+ * Python str.isSpace()
150
153
  */
151
- isspace(s: string): boolean;
154
+ isSpace(s: string): boolean;
152
155
  /**
153
- * Python str.isupper()
156
+ * Python str.isUpper()
154
157
  */
155
- isupper(s: string): boolean;
158
+ isUpper(s: string): boolean;
156
159
  /**
157
- * Python str.islower()
160
+ * Python str.isLower()
158
161
  */
159
- islower(s: string): boolean;
162
+ isLower(s: string): boolean;
160
163
  /**
161
164
  * Python str.format() - basic implementation
162
165
  */
163
166
  format(s: string, ...args: unknown[]): string;
164
167
  };
165
168
 
166
- export { Template, ascii_letters, ascii_lowercase, ascii_uppercase, capwords, digits, hexdigits, octdigits, printable, punctuation, string, whitespace };
169
+ export { Template, asciiLetters, asciiLowercase, asciiUppercase, capWords, digits, hexDigits, octDigits, printable, punctuation, string, whitespace };
package/dist/string.js CHANGED
@@ -1,27 +1,27 @@
1
1
  import {
2
2
  Template,
3
- ascii_letters,
4
- ascii_lowercase,
5
- ascii_uppercase,
6
- capwords,
3
+ asciiLetters,
4
+ asciiLowercase,
5
+ asciiUppercase,
6
+ capWords,
7
7
  digits,
8
- hexdigits,
9
- octdigits,
8
+ hexDigits,
9
+ octDigits,
10
10
  printable,
11
11
  punctuation,
12
12
  string,
13
13
  whitespace
14
- } from "./chunk-3CSEXTA7.js";
14
+ } from "./chunk-4QG3772L.js";
15
15
  import "./chunk-PZ5AY32C.js";
16
16
  export {
17
17
  Template,
18
- ascii_letters,
19
- ascii_lowercase,
20
- ascii_uppercase,
21
- capwords,
18
+ asciiLetters,
19
+ asciiLowercase,
20
+ asciiUppercase,
21
+ capWords,
22
22
  digits,
23
- hexdigits,
24
- octdigits,
23
+ hexDigits,
24
+ octDigits,
25
25
  printable,
26
26
  punctuation,
27
27
  string,
package/package.json CHANGED
@@ -1,12 +1,20 @@
1
1
  {
2
2
  "name": "pythonlib",
3
- "version": "0.1.0",
4
- "description": "Python standard library for TypeScript - itertools, functools, collections, and more",
3
+ "version": "0.2.0",
4
+ "description": "Python standard library for TypeScript - itertools, functools, collections, datetime, re, and more. Zero dependencies. Full TypeScript support.",
5
+ "homepage": "https://sebastian-software.github.io/python2ts/",
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/sebastian-software/python2ts.git",
8
9
  "directory": "packages/pythonlib"
9
10
  },
11
+ "bugs": {
12
+ "url": "https://github.com/sebastian-software/python2ts/issues"
13
+ },
14
+ "funding": {
15
+ "type": "github",
16
+ "url": "https://github.com/sponsors/sebastian-software"
17
+ },
10
18
  "type": "module",
11
19
  "main": "dist/index.js",
12
20
  "types": "dist/index.d.ts",
@@ -71,7 +79,16 @@
71
79
  "itertools",
72
80
  "functools",
73
81
  "collections",
74
- "stdlib"
82
+ "stdlib",
83
+ "datetime",
84
+ "regex",
85
+ "range",
86
+ "enumerate",
87
+ "zip",
88
+ "combinations",
89
+ "permutations",
90
+ "counter",
91
+ "lru-cache"
75
92
  ],
76
93
  "author": "Sebastian Software GmbH",
77
94
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/string.ts"],"sourcesContent":["/**\n * Python string methods and constants for TypeScript\n * Usage: py.string.join(), py.string.split(), py.string.ascii_lowercase, etc.\n */\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\n// ============================================================================\n// String constants (Python string module)\n// ============================================================================\n\n/** The lowercase letters 'abcdefghijklmnopqrstuvwxyz' */\nexport const ascii_lowercase = \"abcdefghijklmnopqrstuvwxyz\"\n\n/** The uppercase letters 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' */\nexport const ascii_uppercase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n/** The concatenation of ascii_lowercase and ascii_uppercase */\nexport const ascii_letters = ascii_lowercase + ascii_uppercase\n\n/** The string '0123456789' */\nexport const digits = \"0123456789\"\n\n/** The string '0123456789abcdefABCDEF' */\nexport const hexdigits = \"0123456789abcdefABCDEF\"\n\n/** The string '01234567' */\nexport const octdigits = \"01234567\"\n\n/** String of ASCII characters which are considered punctuation */\nexport const punctuation = \"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\"\n\n/** String of ASCII characters which are considered whitespace */\nexport const whitespace = \" \\t\\n\\r\\x0b\\x0c\"\n\n/** String of ASCII characters which are considered printable */\nexport const printable = digits + ascii_letters + punctuation + whitespace\n\n// ============================================================================\n// Template class\n// ============================================================================\n\nexport class Template {\n readonly template: string\n\n constructor(template: string) {\n this.template = template\n }\n\n /** Perform substitution, raising KeyError for missing keys */\n substitute(mapping?: Record<string, unknown>): string {\n const combined = { ...mapping }\n return this.template.replace(\n /\\$\\$|\\$(\\w+)|\\$\\{(\\w+)\\}/g,\n (match, name1: string, name2: string) => {\n if (match === \"$$\") return \"$\"\n const name = name1 || name2\n if (!(name in combined)) {\n throw new Error(`KeyError: '${name}'`)\n }\n return String(combined[name])\n }\n )\n }\n\n /** Perform substitution, returning original placeholder for missing keys */\n safe_substitute(mapping?: Record<string, unknown>): string {\n const combined = { ...mapping }\n return this.template.replace(\n /\\$\\$|\\$(\\w+)|\\$\\{(\\w+)\\}/g,\n (match, name1: string, name2: string) => {\n if (match === \"$$\") return \"$\"\n const name = name1 || name2\n if (!(name in combined)) {\n return match\n }\n return String(combined[name])\n }\n )\n }\n\n /** Get identifiers in template */\n get_identifiers(): string[] {\n const identifiers: string[] = []\n const regex = /\\$(\\w+)|\\$\\{(\\w+)\\}/g\n let match: RegExpExecArray | null\n while ((match = regex.exec(this.template)) !== null) {\n const name = match[1] || match[2]\n if (name && !identifiers.includes(name)) {\n identifiers.push(name)\n }\n }\n return identifiers\n }\n}\n\n/** Capitalize words in string */\nexport function capwords(s: string, sep?: string): string {\n const separator = sep ?? \" \"\n return s\n .split(separator)\n .map((word) => {\n if (!word) return \"\"\n const first = word[0]\n return first ? first.toUpperCase() + word.slice(1).toLowerCase() : word\n })\n .join(separator)\n}\n\nexport const string = {\n /**\n * Python str.join()\n */\n join(sep: string, iterable: Iterable<string>): string {\n return Array.from(iterable).join(sep)\n },\n\n /**\n * Python str.split()\n */\n split(s: string, sep?: string, maxsplit?: number): string[] {\n if (sep === undefined) {\n // Split on whitespace\n const result = s.trim().split(/\\s+/)\n if (maxsplit !== undefined && maxsplit >= 0) {\n if (result.length > maxsplit + 1) {\n const limited = result.slice(0, maxsplit)\n limited.push(result.slice(maxsplit).join(\" \"))\n return limited\n }\n }\n return result\n }\n\n if (maxsplit !== undefined && maxsplit >= 0) {\n const parts = s.split(sep)\n if (parts.length > maxsplit + 1) {\n const limited = parts.slice(0, maxsplit)\n limited.push(parts.slice(maxsplit).join(sep))\n return limited\n }\n return parts\n }\n\n return s.split(sep)\n },\n\n /**\n * Python str.rsplit()\n */\n rsplit(s: string, sep?: string, maxsplit?: number): string[] {\n if (sep === undefined) {\n const parts = s.trim().split(/\\s+/)\n if (maxsplit === undefined) return parts\n if (maxsplit <= 0) return [s]\n if (parts.length <= maxsplit + 1) return parts\n const keep = parts.slice(-maxsplit)\n const rest = parts.slice(0, parts.length - maxsplit).join(\" \")\n return [rest, ...keep]\n }\n\n const parts = s.split(sep)\n if (maxsplit === undefined || parts.length <= maxsplit + 1) return parts\n const keep = parts.slice(-maxsplit)\n const rest = parts.slice(0, parts.length - maxsplit).join(sep)\n return [rest, ...keep]\n },\n\n /**\n * Python str.strip()\n */\n strip(s: string, chars?: string): string {\n if (chars === undefined) {\n return s.trim()\n }\n const regex = new RegExp(`^[${escapeRegex(chars)}]+|[${escapeRegex(chars)}]+$`, \"g\")\n return s.replace(regex, \"\")\n },\n\n /**\n * Python str.lstrip()\n */\n lstrip(s: string, chars?: string): string {\n if (chars === undefined) {\n return s.trimStart()\n }\n const regex = new RegExp(`^[${escapeRegex(chars)}]+`)\n return s.replace(regex, \"\")\n },\n\n /**\n * Python str.rstrip()\n */\n rstrip(s: string, chars?: string): string {\n if (chars === undefined) {\n return s.trimEnd()\n }\n const regex = new RegExp(`[${escapeRegex(chars)}]+$`)\n return s.replace(regex, \"\")\n },\n\n /**\n * Python str.upper()\n */\n upper(s: string): string {\n return s.toUpperCase()\n },\n\n /**\n * Python str.lower()\n */\n lower(s: string): string {\n return s.toLowerCase()\n },\n\n /**\n * Python str.capitalize()\n */\n capitalize(s: string): string {\n if (s.length === 0) return s\n return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()\n },\n\n /**\n * Python str.title()\n */\n title(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase())\n },\n\n /**\n * Python str.swapcase()\n */\n swapcase(s: string): string {\n return s\n .split(\"\")\n .map((c) => (c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase()))\n .join(\"\")\n },\n\n /**\n * Python str.startswith()\n */\n startswith(s: string, prefix: string, start?: number, end?: number): boolean {\n const substr = s.slice(start, end)\n return substr.startsWith(prefix)\n },\n\n /**\n * Python str.endswith()\n */\n endswith(s: string, suffix: string, start?: number, end?: number): boolean {\n const substr = s.slice(start, end)\n return substr.endsWith(suffix)\n },\n\n /**\n * Python str.find()\n */\n find(s: string, sub: string, start?: number, end?: number): number {\n const substr = s.slice(start, end)\n const index = substr.indexOf(sub)\n if (index === -1) return -1\n return (start ?? 0) + index\n },\n\n /**\n * Python str.rfind()\n */\n rfind(s: string, sub: string, start?: number, end?: number): number {\n const substr = s.slice(start, end)\n const index = substr.lastIndexOf(sub)\n if (index === -1) return -1\n return (start ?? 0) + index\n },\n\n /**\n * Python str.index() - raises error if not found\n */\n index(s: string, sub: string, start?: number, end?: number): number {\n const result = string.find(s, sub, start, end)\n if (result === -1) {\n throw new Error(\"substring not found\")\n }\n return result\n },\n\n /**\n * Python str.rindex() - raises error if not found\n */\n rindex(s: string, sub: string, start?: number, end?: number): number {\n const result = string.rfind(s, sub, start, end)\n if (result === -1) {\n throw new Error(\"substring not found\")\n }\n return result\n },\n\n /**\n * Python str.count()\n */\n count(s: string, sub: string, start?: number, end?: number): number {\n const substr = s.slice(start, end)\n if (sub.length === 0) return substr.length + 1\n let count = 0\n let pos = 0\n while ((pos = substr.indexOf(sub, pos)) !== -1) {\n count++\n pos += sub.length\n }\n return count\n },\n\n /**\n * Python str.replace()\n */\n replace(s: string, old: string, newStr: string, count?: number): string {\n if (count === undefined || count < 0) {\n return s.split(old).join(newStr)\n }\n\n let result = s\n for (let i = 0; i < count; i++) {\n const index = result.indexOf(old)\n if (index === -1) break\n result = result.slice(0, index) + newStr + result.slice(index + old.length)\n }\n return result\n },\n\n /**\n * Python str.zfill()\n */\n zfill(s: string, width: number): string {\n if (s.length >= width) return s\n const sign = s[0] === \"-\" || s[0] === \"+\" ? s[0] : \"\"\n const digits = sign ? s.slice(1) : s\n return sign + digits.padStart(width - sign.length, \"0\")\n },\n\n /**\n * Python str.center()\n */\n center(s: string, width: number, fillchar = \" \"): string {\n if (s.length >= width) return s\n const total = width - s.length\n const left = Math.floor(total / 2)\n const right = total - left\n return fillchar.repeat(left) + s + fillchar.repeat(right)\n },\n\n /**\n * Python str.ljust()\n */\n ljust(s: string, width: number, fillchar = \" \"): string {\n if (s.length >= width) return s\n return s + fillchar.repeat(width - s.length)\n },\n\n /**\n * Python str.rjust()\n */\n rjust(s: string, width: number, fillchar = \" \"): string {\n if (s.length >= width) return s\n return fillchar.repeat(width - s.length) + s\n },\n\n /**\n * Python str.partition()\n */\n partition(s: string, sep: string): [string, string, string] {\n const index = s.indexOf(sep)\n if (index === -1) return [s, \"\", \"\"]\n return [s.slice(0, index), sep, s.slice(index + sep.length)]\n },\n\n /**\n * Python str.rpartition()\n */\n rpartition(s: string, sep: string): [string, string, string] {\n const index = s.lastIndexOf(sep)\n if (index === -1) return [\"\", \"\", s]\n return [s.slice(0, index), sep, s.slice(index + sep.length)]\n },\n\n /**\n * Python str.isalpha()\n */\n isalpha(s: string): boolean {\n return s.length > 0 && /^[a-zA-Z]+$/.test(s)\n },\n\n /**\n * Python str.isdigit()\n */\n isdigit(s: string): boolean {\n return s.length > 0 && /^[0-9]+$/.test(s)\n },\n\n /**\n * Python str.isalnum()\n */\n isalnum(s: string): boolean {\n return s.length > 0 && /^[a-zA-Z0-9]+$/.test(s)\n },\n\n /**\n * Python str.isspace()\n */\n isspace(s: string): boolean {\n return s.length > 0 && /^\\s+$/.test(s)\n },\n\n /**\n * Python str.isupper()\n */\n isupper(s: string): boolean {\n return s.length > 0 && s === s.toUpperCase() && s !== s.toLowerCase()\n },\n\n /**\n * Python str.islower()\n */\n islower(s: string): boolean {\n return s.length > 0 && s === s.toLowerCase() && s !== s.toUpperCase()\n },\n\n /**\n * Python str.format() - basic implementation\n */\n format(s: string, ...args: unknown[]): string {\n let index = 0\n return s.replace(/\\{(\\d*)\\}/g, (_, num: string) => {\n const i = num === \"\" ? index++ : parseInt(num, 10)\n return String(args[i])\n })\n }\n}\n"],"mappings":";AAKA,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;AAOO,IAAM,kBAAkB;AAGxB,IAAM,kBAAkB;AAGxB,IAAM,gBAAgB,kBAAkB;AAGxC,IAAM,SAAS;AAGf,IAAM,YAAY;AAGlB,IAAM,YAAY;AAGlB,IAAM,cAAc;AAGpB,IAAM,aAAa;AAGnB,IAAM,YAAY,SAAS,gBAAgB,cAAc;AAMzD,IAAM,WAAN,MAAe;AAAA,EACX;AAAA,EAET,YAAY,UAAkB;AAC5B,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA,EAGA,WAAW,SAA2C;AACpD,UAAM,WAAW,EAAE,GAAG,QAAQ;AAC9B,WAAO,KAAK,SAAS;AAAA,MACnB;AAAA,MACA,CAAC,OAAO,OAAe,UAAkB;AACvC,YAAI,UAAU,KAAM,QAAO;AAC3B,cAAM,OAAO,SAAS;AACtB,YAAI,EAAE,QAAQ,WAAW;AACvB,gBAAM,IAAI,MAAM,cAAc,IAAI,GAAG;AAAA,QACvC;AACA,eAAO,OAAO,SAAS,IAAI,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,gBAAgB,SAA2C;AACzD,UAAM,WAAW,EAAE,GAAG,QAAQ;AAC9B,WAAO,KAAK,SAAS;AAAA,MACnB;AAAA,MACA,CAAC,OAAO,OAAe,UAAkB;AACvC,YAAI,UAAU,KAAM,QAAO;AAC3B,cAAM,OAAO,SAAS;AACtB,YAAI,EAAE,QAAQ,WAAW;AACvB,iBAAO;AAAA,QACT;AACA,eAAO,OAAO,SAAS,IAAI,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,kBAA4B;AAC1B,UAAM,cAAwB,CAAC;AAC/B,UAAM,QAAQ;AACd,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,KAAK,QAAQ,OAAO,MAAM;AACnD,YAAM,OAAO,MAAM,CAAC,KAAK,MAAM,CAAC;AAChC,UAAI,QAAQ,CAAC,YAAY,SAAS,IAAI,GAAG;AACvC,oBAAY,KAAK,IAAI;AAAA,MACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAGO,SAAS,SAAS,GAAW,KAAsB;AACxD,QAAM,YAAY,OAAO;AACzB,SAAO,EACJ,MAAM,SAAS,EACf,IAAI,CAAC,SAAS;AACb,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,KAAK,CAAC;AACpB,WAAO,QAAQ,MAAM,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,IAAI;AAAA,EACrE,CAAC,EACA,KAAK,SAAS;AACnB;AAEO,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA,EAIpB,KAAK,KAAa,UAAoC;AACpD,WAAO,MAAM,KAAK,QAAQ,EAAE,KAAK,GAAG;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,KAAc,UAA6B;AAC1D,QAAI,QAAQ,QAAW;AAErB,YAAM,SAAS,EAAE,KAAK,EAAE,MAAM,KAAK;AACnC,UAAI,aAAa,UAAa,YAAY,GAAG;AAC3C,YAAI,OAAO,SAAS,WAAW,GAAG;AAChC,gBAAM,UAAU,OAAO,MAAM,GAAG,QAAQ;AACxC,kBAAQ,KAAK,OAAO,MAAM,QAAQ,EAAE,KAAK,GAAG,CAAC;AAC7C,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,UAAa,YAAY,GAAG;AAC3C,YAAM,QAAQ,EAAE,MAAM,GAAG;AACzB,UAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,cAAM,UAAU,MAAM,MAAM,GAAG,QAAQ;AACvC,gBAAQ,KAAK,MAAM,MAAM,QAAQ,EAAE,KAAK,GAAG,CAAC;AAC5C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAW,KAAc,UAA6B;AAC3D,QAAI,QAAQ,QAAW;AACrB,YAAMA,SAAQ,EAAE,KAAK,EAAE,MAAM,KAAK;AAClC,UAAI,aAAa,OAAW,QAAOA;AACnC,UAAI,YAAY,EAAG,QAAO,CAAC,CAAC;AAC5B,UAAIA,OAAM,UAAU,WAAW,EAAG,QAAOA;AACzC,YAAMC,QAAOD,OAAM,MAAM,CAAC,QAAQ;AAClC,YAAME,QAAOF,OAAM,MAAM,GAAGA,OAAM,SAAS,QAAQ,EAAE,KAAK,GAAG;AAC7D,aAAO,CAACE,OAAM,GAAGD,KAAI;AAAA,IACvB;AAEA,UAAM,QAAQ,EAAE,MAAM,GAAG;AACzB,QAAI,aAAa,UAAa,MAAM,UAAU,WAAW,EAAG,QAAO;AACnE,UAAM,OAAO,MAAM,MAAM,CAAC,QAAQ;AAClC,UAAM,OAAO,MAAM,MAAM,GAAG,MAAM,SAAS,QAAQ,EAAE,KAAK,GAAG;AAC7D,WAAO,CAAC,MAAM,GAAG,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,OAAwB;AACvC,QAAI,UAAU,QAAW;AACvB,aAAO,EAAE,KAAK;AAAA,IAChB;AACA,UAAM,QAAQ,IAAI,OAAO,KAAK,YAAY,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,OAAO,GAAG;AACnF,WAAO,EAAE,QAAQ,OAAO,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAW,OAAwB;AACxC,QAAI,UAAU,QAAW;AACvB,aAAO,EAAE,UAAU;AAAA,IACrB;AACA,UAAM,QAAQ,IAAI,OAAO,KAAK,YAAY,KAAK,CAAC,IAAI;AACpD,WAAO,EAAE,QAAQ,OAAO,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAW,OAAwB;AACxC,QAAI,UAAU,QAAW;AACvB,aAAO,EAAE,QAAQ;AAAA,IACnB;AACA,UAAM,QAAQ,IAAI,OAAO,IAAI,YAAY,KAAK,CAAC,KAAK;AACpD,WAAO,EAAE,QAAQ,OAAO,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAmB;AACvB,WAAO,EAAE,YAAY;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAmB;AACvB,WAAO,EAAE,YAAY;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAmB;AAC5B,QAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,WAAO,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAmB;AACvB,WAAO,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,GAAmB;AAC1B,WAAO,EACJ,MAAM,EAAE,EACR,IAAI,CAAC,MAAO,MAAM,EAAE,YAAY,IAAI,EAAE,YAAY,IAAI,EAAE,YAAY,CAAE,EACtE,KAAK,EAAE;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAW,QAAgB,OAAgB,KAAuB;AAC3E,UAAM,SAAS,EAAE,MAAM,OAAO,GAAG;AACjC,WAAO,OAAO,WAAW,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,GAAW,QAAgB,OAAgB,KAAuB;AACzE,UAAM,SAAS,EAAE,MAAM,OAAO,GAAG;AACjC,WAAO,OAAO,SAAS,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,GAAW,KAAa,OAAgB,KAAsB;AACjE,UAAM,SAAS,EAAE,MAAM,OAAO,GAAG;AACjC,UAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,QAAI,UAAU,GAAI,QAAO;AACzB,YAAQ,SAAS,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,KAAa,OAAgB,KAAsB;AAClE,UAAM,SAAS,EAAE,MAAM,OAAO,GAAG;AACjC,UAAM,QAAQ,OAAO,YAAY,GAAG;AACpC,QAAI,UAAU,GAAI,QAAO;AACzB,YAAQ,SAAS,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,KAAa,OAAgB,KAAsB;AAClE,UAAM,SAAS,OAAO,KAAK,GAAG,KAAK,OAAO,GAAG;AAC7C,QAAI,WAAW,IAAI;AACjB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAW,KAAa,OAAgB,KAAsB;AACnE,UAAM,SAAS,OAAO,MAAM,GAAG,KAAK,OAAO,GAAG;AAC9C,QAAI,WAAW,IAAI;AACjB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,KAAa,OAAgB,KAAsB;AAClE,UAAM,SAAS,EAAE,MAAM,OAAO,GAAG;AACjC,QAAI,IAAI,WAAW,EAAG,QAAO,OAAO,SAAS;AAC7C,QAAI,QAAQ;AACZ,QAAI,MAAM;AACV,YAAQ,MAAM,OAAO,QAAQ,KAAK,GAAG,OAAO,IAAI;AAC9C;AACA,aAAO,IAAI;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAW,KAAa,QAAgB,OAAwB;AACtE,QAAI,UAAU,UAAa,QAAQ,GAAG;AACpC,aAAO,EAAE,MAAM,GAAG,EAAE,KAAK,MAAM;AAAA,IACjC;AAEA,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,UAAI,UAAU,GAAI;AAClB,eAAS,OAAO,MAAM,GAAG,KAAK,IAAI,SAAS,OAAO,MAAM,QAAQ,IAAI,MAAM;AAAA,IAC5E;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,OAAuB;AACtC,QAAI,EAAE,UAAU,MAAO,QAAO;AAC9B,UAAM,OAAO,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI;AACnD,UAAME,UAAS,OAAO,EAAE,MAAM,CAAC,IAAI;AACnC,WAAO,OAAOA,QAAO,SAAS,QAAQ,KAAK,QAAQ,GAAG;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAW,OAAe,WAAW,KAAa;AACvD,QAAI,EAAE,UAAU,MAAO,QAAO;AAC9B,UAAM,QAAQ,QAAQ,EAAE;AACxB,UAAM,OAAO,KAAK,MAAM,QAAQ,CAAC;AACjC,UAAM,QAAQ,QAAQ;AACtB,WAAO,SAAS,OAAO,IAAI,IAAI,IAAI,SAAS,OAAO,KAAK;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,OAAe,WAAW,KAAa;AACtD,QAAI,EAAE,UAAU,MAAO,QAAO;AAC9B,WAAO,IAAI,SAAS,OAAO,QAAQ,EAAE,MAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAW,OAAe,WAAW,KAAa;AACtD,QAAI,EAAE,UAAU,MAAO,QAAO;AAC9B,WAAO,SAAS,OAAO,QAAQ,EAAE,MAAM,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,GAAW,KAAuC;AAC1D,UAAM,QAAQ,EAAE,QAAQ,GAAG;AAC3B,QAAI,UAAU,GAAI,QAAO,CAAC,GAAG,IAAI,EAAE;AACnC,WAAO,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAW,KAAuC;AAC3D,UAAM,QAAQ,EAAE,YAAY,GAAG;AAC/B,QAAI,UAAU,GAAI,QAAO,CAAC,IAAI,IAAI,CAAC;AACnC,WAAO,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAoB;AAC1B,WAAO,EAAE,SAAS,KAAK,cAAc,KAAK,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAoB;AAC1B,WAAO,EAAE,SAAS,KAAK,WAAW,KAAK,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAoB;AAC1B,WAAO,EAAE,SAAS,KAAK,iBAAiB,KAAK,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAoB;AAC1B,WAAO,EAAE,SAAS,KAAK,QAAQ,KAAK,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAoB;AAC1B,WAAO,EAAE,SAAS,KAAK,MAAM,EAAE,YAAY,KAAK,MAAM,EAAE,YAAY;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAoB;AAC1B,WAAO,EAAE,SAAS,KAAK,MAAM,EAAE,YAAY,KAAK,MAAM,EAAE,YAAY;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAc,MAAyB;AAC5C,QAAI,QAAQ;AACZ,WAAO,EAAE,QAAQ,cAAc,CAAC,GAAG,QAAgB;AACjD,YAAM,IAAI,QAAQ,KAAK,UAAU,SAAS,KAAK,EAAE;AACjD,aAAO,OAAO,KAAK,CAAC,CAAC;AAAA,IACvB,CAAC;AAAA,EACH;AACF;","names":["parts","keep","rest","digits"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/datetime.ts"],"sourcesContent":["/**\n * Python datetime module for TypeScript\n *\n * Provides date and time handling matching Python's datetime module.\n */\n\n// ============================================================================\n// timedelta class\n// ============================================================================\n\nexport class timedelta {\n readonly days: number\n readonly seconds: number\n readonly microseconds: number\n\n constructor(options?: {\n days?: number\n seconds?: number\n microseconds?: number\n milliseconds?: number\n minutes?: number\n hours?: number\n weeks?: number\n }) {\n let totalMicroseconds = 0\n\n if (options) {\n totalMicroseconds += (options.weeks ?? 0) * 7 * 24 * 60 * 60 * 1000000\n totalMicroseconds += (options.days ?? 0) * 24 * 60 * 60 * 1000000\n totalMicroseconds += (options.hours ?? 0) * 60 * 60 * 1000000\n totalMicroseconds += (options.minutes ?? 0) * 60 * 1000000\n totalMicroseconds += (options.seconds ?? 0) * 1000000\n totalMicroseconds += (options.milliseconds ?? 0) * 1000\n totalMicroseconds += options.microseconds ?? 0\n }\n\n // Normalize to days, seconds, microseconds\n const sign = totalMicroseconds < 0 ? -1 : 1\n totalMicroseconds = Math.abs(totalMicroseconds)\n\n this.microseconds = sign * (totalMicroseconds % 1000000)\n totalMicroseconds = Math.floor(totalMicroseconds / 1000000)\n\n this.seconds = sign * (totalMicroseconds % (24 * 60 * 60))\n this.days = sign * Math.floor(totalMicroseconds / (24 * 60 * 60))\n\n // Normalize negative values\n if (this.microseconds < 0) {\n ;(this as { microseconds: number }).microseconds += 1000000\n ;(this as { seconds: number }).seconds -= 1\n }\n if (this.seconds < 0) {\n ;(this as { seconds: number }).seconds += 24 * 60 * 60\n ;(this as { days: number }).days -= 1\n }\n }\n\n total_seconds(): number {\n return this.days * 24 * 60 * 60 + this.seconds + this.microseconds / 1000000\n }\n\n toString(): string {\n const parts: string[] = []\n if (this.days !== 0) {\n parts.push(`${String(this.days)} day${Math.abs(this.days) !== 1 ? \"s\" : \"\"}`)\n }\n const hours = Math.floor(this.seconds / 3600)\n const minutes = Math.floor((this.seconds % 3600) / 60)\n const secs = this.seconds % 60\n const timeStr = `${String(hours)}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`\n if (this.microseconds > 0) {\n parts.push(`${timeStr}.${String(this.microseconds).padStart(6, \"0\")}`)\n } else {\n parts.push(timeStr)\n }\n return parts.join(\", \")\n }\n\n add(other: timedelta): timedelta {\n return new timedelta({\n days: this.days + other.days,\n seconds: this.seconds + other.seconds,\n microseconds: this.microseconds + other.microseconds\n })\n }\n\n subtract(other: timedelta): timedelta {\n return new timedelta({\n days: this.days - other.days,\n seconds: this.seconds - other.seconds,\n microseconds: this.microseconds - other.microseconds\n })\n }\n\n multiply(n: number): timedelta {\n return new timedelta({\n microseconds: Math.round(this.total_seconds() * 1000000 * n)\n })\n }\n\n static min = new timedelta({ days: -999999999 })\n static max = new timedelta({\n days: 999999999,\n hours: 23,\n minutes: 59,\n seconds: 59,\n microseconds: 999999\n })\n static resolution = new timedelta({ microseconds: 1 })\n}\n\n// ============================================================================\n// date class\n// ============================================================================\n\nexport class date {\n readonly year: number\n readonly month: number\n readonly day: number\n\n constructor(year: number, month: number, day: number) {\n if (month < 1 || month > 12) {\n throw new Error(\"month must be in 1..12\")\n }\n const maxDay = new Date(year, month, 0).getDate()\n if (day < 1 || day > maxDay) {\n throw new Error(`day is out of range for month`)\n }\n this.year = year\n this.month = month\n this.day = day\n }\n\n static today(): date {\n const now = new Date()\n return new date(now.getFullYear(), now.getMonth() + 1, now.getDate())\n }\n\n static fromtimestamp(timestamp: number): date {\n const d = new Date(timestamp * 1000)\n return new date(d.getFullYear(), d.getMonth() + 1, d.getDate())\n }\n\n static fromisoformat(dateString: string): date {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateString)\n if (!match || !match[1] || !match[2] || !match[3]) {\n throw new Error(`Invalid isoformat string: '${dateString}'`)\n }\n return new date(parseInt(match[1]), parseInt(match[2]), parseInt(match[3]))\n }\n\n static fromordinal(ordinal: number): date {\n // Days since year 1\n const d = new Date(Date.UTC(1, 0, ordinal))\n return new date(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate())\n }\n\n replace(options?: { year?: number; month?: number; day?: number }): date {\n return new date(\n options?.year ?? this.year,\n options?.month ?? this.month,\n options?.day ?? this.day\n )\n }\n\n toordinal(): number {\n const d = new Date(Date.UTC(this.year, this.month - 1, this.day))\n const epoch = new Date(Date.UTC(1, 0, 1))\n return Math.floor((d.getTime() - epoch.getTime()) / (24 * 60 * 60 * 1000)) + 1\n }\n\n weekday(): number {\n // Monday is 0, Sunday is 6\n const d = new Date(this.year, this.month - 1, this.day)\n return (d.getDay() + 6) % 7\n }\n\n isoweekday(): number {\n // Monday is 1, Sunday is 7\n return this.weekday() + 1\n }\n\n isocalendar(): [number, number, number] {\n const d = new Date(this.year, this.month - 1, this.day)\n const dayOfYear = Math.floor(\n (d.getTime() - new Date(this.year, 0, 0).getTime()) / (24 * 60 * 60 * 1000)\n )\n const jan1 = new Date(this.year, 0, 1)\n const jan1Weekday = (jan1.getDay() + 6) % 7 // Monday = 0\n\n let week = Math.floor((dayOfYear + jan1Weekday - 1) / 7)\n let year = this.year\n\n if (week < 1) {\n year -= 1\n week = 52\n } else if (week > 52) {\n const dec31 = new Date(this.year, 11, 31)\n const dec31Weekday = (dec31.getDay() + 6) % 7\n if (dec31Weekday < 3) {\n week = 1\n year += 1\n }\n }\n\n return [year, week, this.isoweekday()]\n }\n\n isoformat(): string {\n return `${String(this.year)}-${String(this.month).padStart(2, \"0\")}-${String(this.day).padStart(2, \"0\")}`\n }\n\n strftime(format: string): string {\n return strftime(format, new datetime(this.year, this.month, this.day, 0, 0, 0, 0))\n }\n\n toString(): string {\n return this.isoformat()\n }\n\n __add__(delta: timedelta): date {\n const d = new Date(this.year, this.month - 1, this.day + delta.days)\n return new date(d.getFullYear(), d.getMonth() + 1, d.getDate())\n }\n\n __sub__(other: date | timedelta): date | timedelta {\n if (other instanceof timedelta) {\n const d = new Date(this.year, this.month - 1, this.day - other.days)\n return new date(d.getFullYear(), d.getMonth() + 1, d.getDate())\n }\n // other is a date\n const d1 = new Date(this.year, this.month - 1, this.day)\n const d2 = new Date(other.year, other.month - 1, other.day)\n const diffMs = d1.getTime() - d2.getTime()\n return new timedelta({ days: Math.floor(diffMs / (24 * 60 * 60 * 1000)) })\n }\n\n __lt__(other: date): boolean {\n return this.toordinal() < other.toordinal()\n }\n\n __le__(other: date): boolean {\n return this.toordinal() <= other.toordinal()\n }\n\n __gt__(other: date): boolean {\n return this.toordinal() > other.toordinal()\n }\n\n __ge__(other: date): boolean {\n return this.toordinal() >= other.toordinal()\n }\n\n __eq__(other: date): boolean {\n return this.toordinal() === other.toordinal()\n }\n\n static min = new date(1, 1, 1)\n static max = new date(9999, 12, 31)\n static resolution = new timedelta({ days: 1 })\n}\n\n// ============================================================================\n// time class\n// ============================================================================\n\nexport class time {\n readonly hour: number\n readonly minute: number\n readonly second: number\n readonly microsecond: number\n readonly tzinfo: null\n\n constructor(hour: number = 0, minute: number = 0, second: number = 0, microsecond: number = 0) {\n if (hour < 0 || hour > 23) throw new Error(\"hour must be in 0..23\")\n if (minute < 0 || minute > 59) throw new Error(\"minute must be in 0..59\")\n if (second < 0 || second > 59) throw new Error(\"second must be in 0..59\")\n if (microsecond < 0 || microsecond > 999999) throw new Error(\"microsecond must be in 0..999999\")\n\n this.hour = hour\n this.minute = minute\n this.second = second\n this.microsecond = microsecond\n this.tzinfo = null\n }\n\n static fromisoformat(timeString: string): time {\n const match = /^(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?$/.exec(timeString)\n if (!match || !match[1] || !match[2] || !match[3]) {\n throw new Error(`Invalid isoformat string: '${timeString}'`)\n }\n const microsecond = match[4] ? parseInt(match[4].padEnd(6, \"0\").slice(0, 6)) : 0\n return new time(parseInt(match[1]), parseInt(match[2]), parseInt(match[3]), microsecond)\n }\n\n replace(options?: {\n hour?: number\n minute?: number\n second?: number\n microsecond?: number\n }): time {\n return new time(\n options?.hour ?? this.hour,\n options?.minute ?? this.minute,\n options?.second ?? this.second,\n options?.microsecond ?? this.microsecond\n )\n }\n\n isoformat(\n timespec: \"auto\" | \"hours\" | \"minutes\" | \"seconds\" | \"milliseconds\" | \"microseconds\" = \"auto\"\n ): string {\n const hh = String(this.hour).padStart(2, \"0\")\n const mm = String(this.minute).padStart(2, \"0\")\n const ss = String(this.second).padStart(2, \"0\")\n\n switch (timespec) {\n case \"hours\":\n return hh\n case \"minutes\":\n return `${hh}:${mm}`\n case \"seconds\":\n return `${hh}:${mm}:${ss}`\n case \"milliseconds\":\n return `${hh}:${mm}:${ss}.${String(Math.floor(this.microsecond / 1000)).padStart(3, \"0\")}`\n case \"microseconds\":\n return `${hh}:${mm}:${ss}.${String(this.microsecond).padStart(6, \"0\")}`\n case \"auto\":\n default:\n if (this.microsecond > 0) {\n return `${hh}:${mm}:${ss}.${String(this.microsecond).padStart(6, \"0\")}`\n }\n return `${hh}:${mm}:${ss}`\n }\n }\n\n strftime(format: string): string {\n return strftime(\n format,\n new datetime(1900, 1, 1, this.hour, this.minute, this.second, this.microsecond)\n )\n }\n\n toString(): string {\n return this.isoformat()\n }\n\n static min = new time(0, 0, 0, 0)\n static max = new time(23, 59, 59, 999999)\n static resolution = new timedelta({ microseconds: 1 })\n}\n\n// ============================================================================\n// datetime class\n// ============================================================================\n\nexport class datetime extends date {\n readonly hour: number\n readonly minute: number\n readonly second: number\n readonly microsecond: number\n readonly tzinfo: null\n\n constructor(\n year: number,\n month: number,\n day: number,\n hour: number = 0,\n minute: number = 0,\n second: number = 0,\n microsecond: number = 0\n ) {\n super(year, month, day)\n if (hour < 0 || hour > 23) throw new Error(\"hour must be in 0..23\")\n if (minute < 0 || minute > 59) throw new Error(\"minute must be in 0..59\")\n if (second < 0 || second > 59) throw new Error(\"second must be in 0..59\")\n if (microsecond < 0 || microsecond > 999999) throw new Error(\"microsecond must be in 0..999999\")\n\n this.hour = hour\n this.minute = minute\n this.second = second\n this.microsecond = microsecond\n this.tzinfo = null\n }\n\n static override today(): datetime {\n return datetime.now()\n }\n\n static now(): datetime {\n const d = new Date()\n return new datetime(\n d.getFullYear(),\n d.getMonth() + 1,\n d.getDate(),\n d.getHours(),\n d.getMinutes(),\n d.getSeconds(),\n d.getMilliseconds() * 1000\n )\n }\n\n static utcnow(): datetime {\n const d = new Date()\n return new datetime(\n d.getUTCFullYear(),\n d.getUTCMonth() + 1,\n d.getUTCDate(),\n d.getUTCHours(),\n d.getUTCMinutes(),\n d.getUTCSeconds(),\n d.getUTCMilliseconds() * 1000\n )\n }\n\n static override fromtimestamp(timestamp: number): datetime {\n const d = new Date(timestamp * 1000)\n return new datetime(\n d.getFullYear(),\n d.getMonth() + 1,\n d.getDate(),\n d.getHours(),\n d.getMinutes(),\n d.getSeconds(),\n d.getMilliseconds() * 1000\n )\n }\n\n static utcfromtimestamp(timestamp: number): datetime {\n const d = new Date(timestamp * 1000)\n return new datetime(\n d.getUTCFullYear(),\n d.getUTCMonth() + 1,\n d.getUTCDate(),\n d.getUTCHours(),\n d.getUTCMinutes(),\n d.getUTCSeconds(),\n d.getUTCMilliseconds() * 1000\n )\n }\n\n static override fromisoformat(s: string): datetime {\n // Parse ISO format: YYYY-MM-DD[T]HH:MM:SS[.ffffff]\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})[T ](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?$/.exec(s)\n if (!match || !match[1] || !match[2] || !match[3] || !match[4] || !match[5] || !match[6]) {\n // Try date-only format\n const dateMatch = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s)\n if (dateMatch && dateMatch[1] && dateMatch[2] && dateMatch[3]) {\n return new datetime(parseInt(dateMatch[1]), parseInt(dateMatch[2]), parseInt(dateMatch[3]))\n }\n throw new Error(`Invalid isoformat string: '${s}'`)\n }\n const microsecond = match[7] ? parseInt(match[7].padEnd(6, \"0\").slice(0, 6)) : 0\n return new datetime(\n parseInt(match[1]),\n parseInt(match[2]),\n parseInt(match[3]),\n parseInt(match[4]),\n parseInt(match[5]),\n parseInt(match[6]),\n microsecond\n )\n }\n\n static combine(d: date, t: time): datetime {\n return new datetime(d.year, d.month, d.day, t.hour, t.minute, t.second, t.microsecond)\n }\n\n static strptime(dateString: string, format: string): datetime {\n return strptime(dateString, format)\n }\n\n override replace(options?: {\n year?: number\n month?: number\n day?: number\n hour?: number\n minute?: number\n second?: number\n microsecond?: number\n }): datetime {\n return new datetime(\n options?.year ?? this.year,\n options?.month ?? this.month,\n options?.day ?? this.day,\n options?.hour ?? this.hour,\n options?.minute ?? this.minute,\n options?.second ?? this.second,\n options?.microsecond ?? this.microsecond\n )\n }\n\n date(): date {\n return new date(this.year, this.month, this.day)\n }\n\n time(): time {\n return new time(this.hour, this.minute, this.second, this.microsecond)\n }\n\n timestamp(): number {\n const d = new Date(\n this.year,\n this.month - 1,\n this.day,\n this.hour,\n this.minute,\n this.second,\n this.microsecond / 1000\n )\n return d.getTime() / 1000\n }\n\n override isoformat(\n sep: string = \"T\",\n timespec: \"auto\" | \"hours\" | \"minutes\" | \"seconds\" | \"milliseconds\" | \"microseconds\" = \"auto\"\n ): string {\n const dateStr = super.isoformat()\n const t = new time(this.hour, this.minute, this.second, this.microsecond)\n return `${dateStr}${sep}${t.isoformat(timespec)}`\n }\n\n ctime(): string {\n const days = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\n const months = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ]\n const dayName = days[this.weekday()] ?? \"???\"\n const monthName = months[this.month - 1] ?? \"???\"\n return `${dayName} ${monthName} ${String(this.day).padStart(2, \" \")} ${String(this.hour).padStart(2, \"0\")}:${String(this.minute).padStart(2, \"0\")}:${String(this.second).padStart(2, \"0\")} ${String(this.year)}`\n }\n\n override strftime(format: string): string {\n return strftime(format, this)\n }\n\n override toString(): string {\n return this.isoformat(\" \")\n }\n\n override __add__(delta: timedelta): datetime {\n const totalMicroseconds =\n this.timestamp() * 1000000 + this.microsecond + delta.total_seconds() * 1000000\n return datetime.fromtimestamp(totalMicroseconds / 1000000)\n }\n\n override __sub__(other: datetime | date | timedelta): datetime | timedelta {\n if (other instanceof timedelta) {\n const totalMicroseconds =\n this.timestamp() * 1000000 + this.microsecond - other.total_seconds() * 1000000\n return datetime.fromtimestamp(totalMicroseconds / 1000000)\n }\n if (other instanceof datetime) {\n const diff = this.timestamp() - other.timestamp()\n const microDiff = this.microsecond - other.microsecond\n return new timedelta({ seconds: diff, microseconds: microDiff })\n }\n // other is a date\n const d1 = new Date(this.year, this.month - 1, this.day)\n const d2 = new Date(other.year, other.month - 1, other.day)\n const diffMs = d1.getTime() - d2.getTime()\n return new timedelta({ days: Math.floor(diffMs / (24 * 60 * 60 * 1000)) })\n }\n\n static override min = new datetime(1, 1, 1, 0, 0, 0, 0)\n static override max = new datetime(9999, 12, 31, 23, 59, 59, 999999)\n static override resolution = new timedelta({ microseconds: 1 })\n}\n\n// ============================================================================\n// strftime and strptime\n// ============================================================================\n\nconst WEEKDAY_NAMES = [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\nconst WEEKDAY_ABBR = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\nconst MONTH_NAMES = [\n \"\",\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n]\nconst MONTH_ABBR = [\n \"\",\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n]\n\nexport function strftime(format: string, dt: datetime): string {\n const pad = (n: number, width: number = 2) => String(n).padStart(width, \"0\")\n\n return format.replace(/%([aAbBcdHIjmMpSUwWxXyYzZ%])/g, (_, code: string) => {\n switch (code) {\n case \"a\":\n return WEEKDAY_ABBR[dt.weekday()] ?? \"\"\n case \"A\":\n return WEEKDAY_NAMES[dt.weekday()] ?? \"\"\n case \"b\":\n return MONTH_ABBR[dt.month] ?? \"\"\n case \"B\":\n return MONTH_NAMES[dt.month] ?? \"\"\n case \"c\":\n return dt.ctime()\n case \"d\":\n return pad(dt.day)\n case \"H\":\n return pad(dt.hour)\n case \"I\":\n return pad(dt.hour % 12 || 12)\n case \"j\": {\n const start = new Date(dt.year, 0, 0)\n const diff = new Date(dt.year, dt.month - 1, dt.day).getTime() - start.getTime()\n const dayOfYear = Math.floor(diff / (24 * 60 * 60 * 1000))\n return pad(dayOfYear, 3)\n }\n case \"m\":\n return pad(dt.month)\n case \"M\":\n return pad(dt.minute)\n case \"p\":\n return dt.hour < 12 ? \"AM\" : \"PM\"\n case \"S\":\n return pad(dt.second)\n case \"U\": {\n // Week number (Sunday as first day)\n const start = new Date(dt.year, 0, 1)\n const diff = new Date(dt.year, dt.month - 1, dt.day).getTime() - start.getTime()\n const dayOfYear = Math.floor(diff / (24 * 60 * 60 * 1000))\n const firstSunday = (7 - start.getDay()) % 7\n return pad(Math.floor((dayOfYear - firstSunday + 7) / 7))\n }\n case \"w\":\n return String((dt.weekday() + 1) % 7)\n case \"W\": {\n // Week number (Monday as first day)\n const start = new Date(dt.year, 0, 1)\n const diff = new Date(dt.year, dt.month - 1, dt.day).getTime() - start.getTime()\n const dayOfYear = Math.floor(diff / (24 * 60 * 60 * 1000))\n const firstMonday = (8 - start.getDay()) % 7\n return pad(Math.floor((dayOfYear - firstMonday + 7) / 7))\n }\n case \"x\":\n return `${pad(dt.month)}/${pad(dt.day)}/${pad(dt.year % 100)}`\n case \"X\":\n return `${pad(dt.hour)}:${pad(dt.minute)}:${pad(dt.second)}`\n case \"y\":\n return pad(dt.year % 100)\n case \"Y\":\n return String(dt.year)\n case \"z\":\n return \"\" // No timezone info\n case \"Z\":\n return \"\" // No timezone name\n case \"%\":\n return \"%\"\n default:\n return `%${code}`\n }\n })\n}\n\nexport function strptime(dateString: string, format: string): datetime {\n let year = 1900,\n month = 1,\n day = 1,\n hour = 0,\n minute = 0,\n second = 0,\n microsecond = 0\n\n // Build regex from format\n let pos = 0\n let formatPos = 0\n\n while (formatPos < format.length) {\n if (format[formatPos] === \"%\") {\n formatPos++\n const code = format[formatPos]\n formatPos++\n\n switch (code) {\n case \"Y\": {\n const match = /^\\d{4}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid year\")\n year = parseInt(match[0])\n pos += 4\n break\n }\n case \"y\": {\n const match = /^\\d{2}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid year\")\n const y = parseInt(match[0])\n year = y >= 69 ? 1900 + y : 2000 + y\n pos += 2\n break\n }\n case \"m\": {\n const match = /^\\d{1,2}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid month\")\n month = parseInt(match[0])\n pos += match[0].length\n break\n }\n case \"d\": {\n const match = /^\\d{1,2}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid day\")\n day = parseInt(match[0])\n pos += match[0].length\n break\n }\n case \"H\": {\n const match = /^\\d{1,2}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid hour\")\n hour = parseInt(match[0])\n pos += match[0].length\n break\n }\n case \"M\": {\n const match = /^\\d{1,2}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid minute\")\n minute = parseInt(match[0])\n pos += match[0].length\n break\n }\n case \"S\": {\n const match = /^\\d{1,2}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid second\")\n second = parseInt(match[0])\n pos += match[0].length\n break\n }\n case \"f\": {\n const match = /^\\d{1,6}/.exec(dateString.slice(pos))\n if (!match) throw new Error(\"Invalid microsecond\")\n microsecond = parseInt(match[0].padEnd(6, \"0\"))\n pos += match[0].length\n break\n }\n case \"b\":\n case \"B\": {\n const names = code === \"b\" ? MONTH_ABBR : MONTH_NAMES\n let found = false\n for (let i = 1; i <= 12; i++) {\n const name = names[i]\n if (name && dateString.slice(pos).toLowerCase().startsWith(name.toLowerCase())) {\n month = i\n pos += name.length\n found = true\n break\n }\n }\n if (!found) throw new Error(\"Invalid month name\")\n break\n }\n case \"%\":\n if (dateString[pos] !== \"%\") throw new Error(\"Expected %\")\n pos++\n break\n default:\n // Skip unknown codes\n break\n }\n } else {\n // Literal character\n const expectedChar = format[formatPos] ?? \"\"\n if (dateString[pos] !== expectedChar) {\n throw new Error(`Expected '${expectedChar}' at position ${String(pos)}`)\n }\n pos++\n formatPos++\n }\n }\n\n return new datetime(year, month, day, hour, minute, second, microsecond)\n}\n\n// ============================================================================\n// Module-level constants\n// ============================================================================\n\nexport const MINYEAR = 1\nexport const MAXYEAR = 9999\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/math.ts"],"sourcesContent":["/**\n * Python math module for TypeScript\n *\n * Provides mathematical functions and constants matching Python's math module.\n * Most functions map directly to JavaScript's Math object.\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Mathematical constant π = 3.141592... */\nexport const pi = Math.PI\n\n/** Mathematical constant e = 2.718281... */\nexport const e = Math.E\n\n/** Mathematical constant τ = 2π = 6.283185... */\nexport const tau = 2 * Math.PI\n\n/** Positive infinity */\nexport const inf = Infinity\n\n/** Not a Number (NaN) */\nexport const nan = NaN\n\n// ============================================================================\n// Number-theoretic and representation functions\n// ============================================================================\n\n/** Return the ceiling of x, the smallest integer greater than or equal to x */\nexport function ceil(x: number): number {\n return Math.ceil(x)\n}\n\n/** Return the floor of x, the largest integer less than or equal to x */\nexport function floor(x: number): number {\n return Math.floor(x)\n}\n\n/** Return the truncated integer part of x (rounds toward zero) */\nexport function trunc(x: number): number {\n return Math.trunc(x)\n}\n\n/** Return the absolute value of x */\nexport function fabs(x: number): number {\n return Math.abs(x)\n}\n\n/** Return x with the sign of y */\nexport function copysign(x: number, y: number): number {\n const sign = y < 0 || (y === 0 && 1 / y < 0) ? -1 : 1\n return sign * Math.abs(x)\n}\n\n/** Return the fractional and integer parts of x */\nexport function modf(x: number): [number, number] {\n const intPart = Math.trunc(x)\n const fracPart = x - intPart\n return [fracPart, intPart]\n}\n\n/** Return the greatest common divisor of a and b */\nexport function gcd(a: number, b: number): number {\n a = Math.abs(Math.floor(a))\n b = Math.abs(Math.floor(b))\n while (b) {\n const t = b\n b = a % b\n a = t\n }\n return a\n}\n\n/** Return the least common multiple of a and b */\nexport function lcm(a: number, b: number): number {\n if (a === 0 || b === 0) return 0\n return Math.abs(Math.floor(a) * Math.floor(b)) / gcd(a, b)\n}\n\n/** Return True if x is neither infinity nor NaN */\nexport function isfinite(x: number): boolean {\n return Number.isFinite(x)\n}\n\n/** Return True if x is positive or negative infinity */\nexport function isinf(x: number): boolean {\n return !Number.isFinite(x) && !Number.isNaN(x)\n}\n\n/** Return True if x is NaN */\nexport function isnan(x: number): boolean {\n return Number.isNaN(x)\n}\n\n/** Return True if the values a and b are close to each other */\nexport function isclose(\n a: number,\n b: number,\n rel_tol: number = 1e-9,\n abs_tol: number = 0.0\n): boolean {\n return Math.abs(a - b) <= Math.max(rel_tol * Math.max(Math.abs(a), Math.abs(b)), abs_tol)\n}\n\n// ============================================================================\n// Power and logarithmic functions\n// ============================================================================\n\n/** Return e raised to the power x */\nexport function exp(x: number): number {\n return Math.exp(x)\n}\n\n/** Return e raised to the power x, minus 1 (more accurate for small x) */\nexport function expm1(x: number): number {\n return Math.expm1(x)\n}\n\n/** Return the natural logarithm of x */\nexport function log(x: number, base?: number): number {\n if (base === undefined) {\n return Math.log(x)\n }\n return Math.log(x) / Math.log(base)\n}\n\n/** Return the natural logarithm of 1+x (more accurate for small x) */\nexport function log1p(x: number): number {\n return Math.log1p(x)\n}\n\n/** Return the base-2 logarithm of x */\nexport function log2(x: number): number {\n return Math.log2(x)\n}\n\n/** Return the base-10 logarithm of x */\nexport function log10(x: number): number {\n return Math.log10(x)\n}\n\n/** Return x raised to the power y */\nexport function pow(x: number, y: number): number {\n return Math.pow(x, y)\n}\n\n/** Return the square root of x */\nexport function sqrt(x: number): number {\n return Math.sqrt(x)\n}\n\n/** Return the cube root of x */\nexport function cbrt(x: number): number {\n return Math.cbrt(x)\n}\n\n/** Return the Euclidean norm, sqrt(sum(x**2 for x in args)) */\nexport function hypot(...args: number[]): number {\n return Math.hypot(...args)\n}\n\n// ============================================================================\n// Trigonometric functions\n// ============================================================================\n\n/** Return the sine of x (x in radians) */\nexport function sin(x: number): number {\n return Math.sin(x)\n}\n\n/** Return the cosine of x (x in radians) */\nexport function cos(x: number): number {\n return Math.cos(x)\n}\n\n/** Return the tangent of x (x in radians) */\nexport function tan(x: number): number {\n return Math.tan(x)\n}\n\n/** Return the arc sine of x, in radians */\nexport function asin(x: number): number {\n return Math.asin(x)\n}\n\n/** Return the arc cosine of x, in radians */\nexport function acos(x: number): number {\n return Math.acos(x)\n}\n\n/** Return the arc tangent of x, in radians */\nexport function atan(x: number): number {\n return Math.atan(x)\n}\n\n/** Return atan(y / x), in radians. The result is between -π and π */\nexport function atan2(y: number, x: number): number {\n return Math.atan2(y, x)\n}\n\n// ============================================================================\n// Hyperbolic functions\n// ============================================================================\n\n/** Return the hyperbolic sine of x */\nexport function sinh(x: number): number {\n return Math.sinh(x)\n}\n\n/** Return the hyperbolic cosine of x */\nexport function cosh(x: number): number {\n return Math.cosh(x)\n}\n\n/** Return the hyperbolic tangent of x */\nexport function tanh(x: number): number {\n return Math.tanh(x)\n}\n\n/** Return the inverse hyperbolic sine of x */\nexport function asinh(x: number): number {\n return Math.asinh(x)\n}\n\n/** Return the inverse hyperbolic cosine of x */\nexport function acosh(x: number): number {\n return Math.acosh(x)\n}\n\n/** Return the inverse hyperbolic tangent of x */\nexport function atanh(x: number): number {\n return Math.atanh(x)\n}\n\n// ============================================================================\n// Angular conversion\n// ============================================================================\n\n/** Convert angle x from radians to degrees */\nexport function degrees(x: number): number {\n return (x * 180) / Math.PI\n}\n\n/** Convert angle x from degrees to radians */\nexport function radians(x: number): number {\n return (x * Math.PI) / 180\n}\n\n// ============================================================================\n// Special functions\n// ============================================================================\n\n/** Return the factorial of n as an integer */\nexport function factorial(n: number): number {\n n = Math.floor(n)\n if (n < 0) throw new Error(\"factorial() not defined for negative values\")\n if (n === 0 || n === 1) return 1\n let result = 1\n for (let i = 2; i <= n; i++) {\n result *= i\n }\n return result\n}\n\n/** Return the sum of products of values from iterables (dot product) */\nexport function fsum(iterable: Iterable<number>): number {\n // Use Kahan summation for better precision\n let sum = 0\n let c = 0\n for (const x of iterable) {\n const y = x - c\n const t = sum + y\n c = t - sum - y\n sum = t\n }\n return sum\n}\n\n/** Return the product of all elements in the iterable */\nexport function prod(iterable: Iterable<number>, start: number = 1): number {\n let result = start\n for (const x of iterable) {\n result *= x\n }\n return result\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/functools.ts"],"sourcesContent":["/**\n * Python functools module for TypeScript\n *\n * Provides higher-order functions and operations on callable objects.\n */\n\n/**\n * Create a partial function application\n * partial(func, arg1, arg2) returns a function that calls func with arg1, arg2 prepended\n *\n * Example:\n * const add = (a: number, b: number) => a + b\n * const add5 = partial(add, 5)\n * add5(3) // returns 8\n */\nexport function partial<T extends (...args: unknown[]) => unknown>(\n func: T,\n ...partialArgs: unknown[]\n): (...args: unknown[]) => ReturnType<T> {\n return (...args: unknown[]): ReturnType<T> => {\n return func(...partialArgs, ...args) as ReturnType<T>\n }\n}\n\n/**\n * Apply a function of two arguments cumulatively to the items of an iterable\n * reduce((x, y) => x + y, [1, 2, 3, 4, 5]) returns 15\n * reduce((x, y) => x + y, [1, 2, 3, 4, 5], 10) returns 25\n */\nexport function reduce<T, U = T>(\n func: (acc: U, val: T) => U,\n iterable: Iterable<T>,\n initializer?: U\n): U {\n const arr = [...iterable]\n\n if (arr.length === 0) {\n if (initializer === undefined) {\n throw new TypeError(\"reduce() of empty sequence with no initial value\")\n }\n return initializer\n }\n\n let acc: U\n let startIdx: number\n\n if (initializer !== undefined) {\n acc = initializer\n startIdx = 0\n } else {\n acc = arr[0] as unknown as U\n startIdx = 1\n }\n\n for (let i = startIdx; i < arr.length; i++) {\n acc = func(acc, arr[i] as T)\n }\n\n return acc\n}\n\n/**\n * Simple LRU cache decorator (returns a memoized version of the function)\n * Note: This is a simplified implementation that caches based on JSON-stringified arguments\n *\n * Example:\n * const fib = lru_cache((n: number): number => n <= 1 ? n : fib(n - 1) + fib(n - 2))\n */\nexport function lru_cache<T extends (...args: unknown[]) => unknown>(\n func: T,\n maxsize: number = 128\n): T & {\n cache_info: () => { hits: number; misses: number; maxsize: number; currsize: number }\n cache_clear: () => void\n} {\n const cache = new Map<string, ReturnType<T>>()\n const order: string[] = []\n let hits = 0\n let misses = 0\n\n const cached = ((...args: unknown[]): ReturnType<T> => {\n const key = JSON.stringify(args)\n\n if (cache.has(key)) {\n hits++\n // Move to end (most recently used)\n const idx = order.indexOf(key)\n if (idx > -1) {\n order.splice(idx, 1)\n order.push(key)\n }\n return cache.get(key) as ReturnType<T>\n }\n\n misses++\n const result = func(...args) as ReturnType<T>\n\n // Evict oldest if at max size\n if (maxsize > 0 && cache.size >= maxsize) {\n const oldest = order.shift()\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n\n cache.set(key, result)\n order.push(key)\n\n return result\n }) as T & {\n cache_info: () => { hits: number; misses: number; maxsize: number; currsize: number }\n cache_clear: () => void\n }\n\n cached.cache_info = () => ({\n hits,\n misses,\n maxsize,\n currsize: cache.size\n })\n\n cached.cache_clear = () => {\n cache.clear()\n order.length = 0\n hits = 0\n misses = 0\n }\n\n return cached\n}\n\n/**\n * Cache decorator that caches all calls (no size limit)\n * Equivalent to lru_cache(maxsize=None)\n */\nexport function cache<T extends (...args: unknown[]) => unknown>(func: T): T {\n const cacheMap = new Map<string, ReturnType<T>>()\n\n return ((...args: unknown[]): ReturnType<T> => {\n const key = JSON.stringify(args)\n if (cacheMap.has(key)) {\n return cacheMap.get(key) as ReturnType<T>\n }\n const result = func(...args) as ReturnType<T>\n cacheMap.set(key, result)\n return result\n }) as T\n}\n\n/**\n * Return a new partial object which behaves like func called with keyword arguments\n * In TypeScript, we simulate this with an options object as the last argument\n */\nexport function partialmethod<T extends (...args: unknown[]) => unknown>(\n func: T,\n ...partialArgs: unknown[]\n): (...args: unknown[]) => ReturnType<T> {\n return partial(func, ...partialArgs)\n}\n\n/**\n * Transform a function into a single-dispatch generic function\n * This is a simplified version - full singledispatch would require runtime type checking\n */\nexport function singledispatch<T extends (...args: unknown[]) => unknown>(\n func: T\n): T & { register: (type: string, impl: T) => void } {\n const registry = new Map<string, T>()\n registry.set(\"object\", func)\n\n const dispatcher = ((...args: unknown[]): ReturnType<T> => {\n if (args.length === 0) {\n return func(...args) as ReturnType<T>\n }\n\n const firstArg = args[0]\n let typeName: string\n\n if (firstArg === null) {\n typeName = \"null\"\n } else if (Array.isArray(firstArg)) {\n typeName = \"array\"\n } else {\n typeName = typeof firstArg\n }\n\n const impl = registry.get(typeName) ?? func\n return impl(...args) as ReturnType<T>\n }) as T & { register: (type: string, impl: T) => void }\n\n dispatcher.register = (type: string, impl: T) => {\n registry.set(type, impl)\n }\n\n return dispatcher\n}\n\n/**\n * Decorator to update a wrapper function to look like the wrapped function\n * In TypeScript, this just returns the wrapper as-is (metadata is handled differently)\n */\nexport function wraps<T extends (...args: unknown[]) => unknown>(\n wrapped: T\n): (wrapper: (...args: unknown[]) => unknown) => T {\n return (wrapper: (...args: unknown[]) => unknown): T => {\n // Copy function name if possible\n Object.defineProperty(wrapper, \"name\", { value: wrapped.name, writable: false })\n return wrapper as T\n }\n}\n\n/**\n * Return a callable object that fetches attr from its operand\n * attrgetter('name') returns a function that gets the 'name' attribute\n */\nexport function attrgetter<T>(...attrs: string[]): (obj: unknown) => T | T[] {\n if (attrs.length === 1) {\n const attr = attrs[0] as string\n const parts = attr.split(\".\")\n return (obj: unknown): T => {\n let result: unknown = obj\n for (const part of parts) {\n result = (result as Record<string, unknown>)[part]\n }\n return result as T\n }\n }\n\n return (obj: unknown): T[] => {\n return attrs.map((attr) => {\n const parts = attr.split(\".\")\n let result: unknown = obj\n for (const part of parts) {\n result = (result as Record<string, unknown>)[part]\n }\n return result as T\n })\n }\n}\n\n/**\n * Return a callable object that fetches item from its operand\n * itemgetter(1) returns a function that gets index 1\n * itemgetter('key') returns a function that gets the 'key' property\n */\nexport function itemgetter<T>(...items: (string | number)[]): (obj: unknown) => T | T[] {\n if (items.length === 1) {\n const item = items[0] as string | number\n return (obj: unknown): T => {\n if (Array.isArray(obj) && typeof item === \"number\") {\n return obj[item] as T\n }\n return (obj as Record<string | number, T>)[item] as T\n }\n }\n\n return (obj: unknown): T[] => {\n return items.map((item): T => {\n if (Array.isArray(obj) && typeof item === \"number\") {\n return obj[item] as T\n }\n return (obj as Record<string | number, T>)[item] as T\n })\n }\n}\n\n/**\n * Return a callable object that calls the method name on its operand\n * methodcaller('split', ' ') returns a function that calls .split(' ')\n */\nexport function methodcaller(name: string, ...args: unknown[]): (obj: unknown) => unknown {\n return (obj: unknown): unknown => {\n const method = (obj as Record<string, (...a: unknown[]) => unknown>)[name]\n if (typeof method !== \"function\") {\n throw new TypeError(`'${typeof obj}' object has no method '${name}'`)\n }\n return method.apply(obj, args)\n }\n}\n\n/**\n * Return the same object passed in (identity function)\n */\nexport function identity<T>(x: T): T {\n return x\n}\n\n/**\n * Compare two objects for ordering (returns -1, 0, or 1)\n * Used for sorting with a key function\n */\nexport function cmp_to_key<T>(\n mycmp: (a: T, b: T) => number\n): (x: T) => { value: T; __lt__: (other: { value: T }) => boolean } {\n return (x: T) => ({\n value: x,\n __lt__(other: { value: T }): boolean {\n return mycmp(x, other.value) < 0\n }\n })\n}\n\n/**\n * Return total ordering for a class that has __lt__, __le__, __gt__, or __ge__\n * This is typically used as a class decorator in Python\n * In TypeScript, we provide helper comparisons\n */\nexport function total_ordering<\n T extends {\n __lt__?: (other: T) => boolean\n __le__?: (other: T) => boolean\n __gt__?: (other: T) => boolean\n __ge__?: (other: T) => boolean\n __eq__?: (other: T) => boolean\n }\n>(\n obj: T\n): T & {\n __lt__: (other: T) => boolean\n __le__: (other: T) => boolean\n __gt__: (other: T) => boolean\n __ge__: (other: T) => boolean\n} {\n const lt = obj.__lt__?.bind(obj)\n const le = obj.__le__?.bind(obj)\n const gt = obj.__gt__?.bind(obj)\n const ge = obj.__ge__?.bind(obj)\n const eq = obj.__eq__?.bind(obj) ?? ((other: T) => obj === other)\n\n const result = obj as T & {\n __lt__: (other: T) => boolean\n __le__: (other: T) => boolean\n __gt__: (other: T) => boolean\n __ge__: (other: T) => boolean\n }\n\n if (lt) {\n result.__lt__ = lt\n result.__le__ = (other: T) => lt(other) || eq(other)\n result.__gt__ = (other: T) => !lt(other) && !eq(other)\n result.__ge__ = (other: T) => !lt(other)\n } else if (le) {\n result.__le__ = le\n result.__lt__ = (other: T) => le(other) && !eq(other)\n result.__gt__ = (other: T) => !le(other)\n result.__ge__ = (other: T) => !le(other) || eq(other)\n } else if (gt) {\n result.__gt__ = gt\n result.__ge__ = (other: T) => gt(other) || eq(other)\n result.__lt__ = (other: T) => !gt(other) && !eq(other)\n result.__le__ = (other: T) => !gt(other)\n } else if (ge) {\n result.__ge__ = ge\n result.__gt__ = (other: T) => ge(other) && !eq(other)\n result.__le__ = (other: T) => !ge(other) || eq(other)\n result.__lt__ = (other: T) => !ge(other)\n }\n\n return result\n}\n"],"mappings":"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","names":["cache"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/json.ts"],"sourcesContent":["/**\n * Python json module for TypeScript\n *\n * Provides JSON encoding and decoding functions matching Python's json module.\n * Maps directly to JavaScript's JSON object with Python-compatible options.\n */\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue }\ntype JsonReplacer = (key: string, value: unknown) => unknown\ntype JsonReviver = (key: string, value: unknown) => unknown\n\ninterface DumpsOptions {\n /** If specified, use this many spaces for indentation */\n indent?: number\n /** Separators for items and key-value pairs [item_sep, key_sep] */\n separators?: [string, string]\n /** Sort dictionary keys */\n sort_keys?: boolean\n /** If false, non-ASCII characters are escaped. Default true */\n ensure_ascii?: boolean\n /** Custom serialization function */\n default?: (obj: unknown) => JsonValue\n}\n\ninterface LoadsOptions {\n /** Custom deserialization function */\n object_hook?: (obj: Record<string, unknown>) => unknown\n /** Parse floats with this function */\n parse_float?: (s: string) => number\n /** Parse integers with this function */\n parse_int?: (s: string) => number\n}\n\n/**\n * Serialize obj to a JSON formatted string.\n *\n * @param obj - The object to serialize\n * @param options - Serialization options\n * @returns JSON string\n */\nexport function dumps(obj: unknown, options?: DumpsOptions): string {\n const indent = options?.indent\n const sortKeys = options?.sort_keys ?? false\n const defaultFn = options?.default\n const ensureAscii = options?.ensure_ascii ?? true\n\n const replacer: JsonReplacer | undefined = sortKeys\n ? (_key, value) => {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[k] = (value as Record<string, unknown>)[k]\n }\n return sorted\n }\n return value\n }\n : undefined\n\n let result: string\n\n try {\n if (defaultFn) {\n // Custom serialization with default function\n result = JSON.stringify(\n obj,\n (key, value: unknown) => {\n const processed: unknown = replacer ? replacer(key, value) : value\n try {\n // Try default serialization first\n JSON.stringify(processed)\n return processed as JsonValue\n } catch {\n // If it fails, use the default function\n return defaultFn(processed)\n }\n },\n indent\n )\n } else {\n result = JSON.stringify(obj, replacer, indent)\n }\n } catch (e) {\n const error = e as Error\n throw new Error(`Object of type ${typeof obj} is not JSON serializable: ${error.message}`)\n }\n\n // Handle separators if specified\n if (options?.separators) {\n const [itemSep, keySep] = options.separators\n // This is a simplified implementation - full separator support would require custom serialization\n if (itemSep !== \", \" || keySep !== \": \") {\n result = result.replace(/,\\s*/g, itemSep).replace(/:\\s*/g, keySep)\n }\n }\n\n // Handle ensure_ascii\n if (ensureAscii) {\n result = result.replace(/[\\u007f-\\uffff]/g, (char) => {\n return \"\\\\u\" + (\"0000\" + char.charCodeAt(0).toString(16)).slice(-4)\n })\n }\n\n return result\n}\n\n/**\n * Deserialize a JSON string to a Python object.\n *\n * @param s - JSON string to parse\n * @param options - Deserialization options\n * @returns Parsed object\n */\nexport function loads(s: string, options?: LoadsOptions): unknown {\n const objectHook = options?.object_hook\n const parseFloat = options?.parse_float\n const parseInt = options?.parse_int\n\n let reviver: JsonReviver | undefined\n\n if (objectHook || parseFloat || parseInt) {\n reviver = (key, value) => {\n if (typeof value === \"number\") {\n const str = String(value)\n if (str.includes(\".\") || str.includes(\"e\") || str.includes(\"E\")) {\n return parseFloat ? parseFloat(str) : value\n }\n return parseInt ? parseInt(str) : value\n }\n if (objectHook && value && typeof value === \"object\" && !Array.isArray(value) && key === \"\") {\n return objectHook(value as Record<string, unknown>)\n }\n return value\n }\n }\n\n try {\n return JSON.parse(s, reviver)\n } catch (e) {\n const error = e as Error\n throw new Error(`JSON decode error: ${error.message}`)\n }\n}\n\n/**\n * Serialize obj to a JSON formatted string and write to file.\n * Note: This is a no-op in browser environments.\n *\n * @param obj - The object to serialize\n * @param fp - File-like object with write method\n * @param options - Serialization options\n */\nexport function dump(\n obj: unknown,\n fp: { write: (s: string) => void },\n options?: DumpsOptions\n): void {\n const s = dumps(obj, options)\n fp.write(s)\n}\n\n/**\n * Deserialize a JSON string from file to a Python object.\n * Note: This is a no-op in browser environments.\n *\n * @param fp - File-like object with read method\n * @param options - Deserialization options\n * @returns Parsed object\n */\nexport function load(fp: { read: () => string }, options?: LoadsOptions): unknown {\n const s = fp.read()\n return loads(s, options)\n}\n"],"mappings":";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCO,SAAS,MAAM,KAAc,SAAgC;AAClE,QAAM,SAAS,SAAS;AACxB,QAAM,WAAW,SAAS,aAAa;AACvC,QAAM,YAAY,SAAS;AAC3B,QAAM,cAAc,SAAS,gBAAgB;AAE7C,QAAM,WAAqC,WACvC,CAAC,MAAM,UAAU;AACf,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM,SAAkC,CAAC;AACzC,iBAAW,KAAK,OAAO,KAAK,KAAgC,EAAE,KAAK,GAAG;AACpE,eAAO,CAAC,IAAK,MAAkC,CAAC;AAAA,MAClD;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,IACA;AAEJ,MAAI;AAEJ,MAAI;AACF,QAAI,WAAW;AAEb,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,CAAC,KAAK,UAAmB;AACvB,gBAAM,YAAqB,WAAW,SAAS,KAAK,KAAK,IAAI;AAC7D,cAAI;AAEF,iBAAK,UAAU,SAAS;AACxB,mBAAO;AAAA,UACT,QAAQ;AAEN,mBAAO,UAAU,SAAS;AAAA,UAC5B;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,KAAK,UAAU,KAAK,UAAU,MAAM;AAAA,IAC/C;AAAA,EACF,SAAS,GAAG;AACV,UAAM,QAAQ;AACd,UAAM,IAAI,MAAM,kBAAkB,OAAO,GAAG,8BAA8B,MAAM,OAAO,EAAE;AAAA,EAC3F;AAGA,MAAI,SAAS,YAAY;AACvB,UAAM,CAAC,SAAS,MAAM,IAAI,QAAQ;AAElC,QAAI,YAAY,QAAQ,WAAW,MAAM;AACvC,eAAS,OAAO,QAAQ,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM;AAAA,IACnE;AAAA,EACF;AAGA,MAAI,aAAa;AACf,aAAS,OAAO,QAAQ,oBAAoB,CAAC,SAAS;AACpD,aAAO,SAAS,SAAS,KAAK,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE;AAAA,IACpE,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AASO,SAAS,MAAM,GAAW,SAAiC;AAChE,QAAM,aAAa,SAAS;AAC5B,QAAM,aAAa,SAAS;AAC5B,QAAM,WAAW,SAAS;AAE1B,MAAI;AAEJ,MAAI,cAAc,cAAc,UAAU;AACxC,cAAU,CAAC,KAAK,UAAU;AACxB,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,MAAM,OAAO,KAAK;AACxB,YAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;AAC/D,iBAAO,aAAa,WAAW,GAAG,IAAI;AAAA,QACxC;AACA,eAAO,WAAW,SAAS,GAAG,IAAI;AAAA,MACpC;AACA,UAAI,cAAc,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAAK,QAAQ,IAAI;AAC3F,eAAO,WAAW,KAAgC;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG,OAAO;AAAA,EAC9B,SAAS,GAAG;AACV,UAAM,QAAQ;AACd,UAAM,IAAI,MAAM,sBAAsB,MAAM,OAAO,EAAE;AAAA,EACvD;AACF;AAUO,SAAS,KACd,KACA,IACA,SACM;AACN,QAAM,IAAI,MAAM,KAAK,OAAO;AAC5B,KAAG,MAAM,CAAC;AACZ;AAUO,SAAS,KAAK,IAA4B,SAAiC;AAChF,QAAM,IAAI,GAAG,KAAK;AAClB,SAAO,MAAM,GAAG,OAAO;AACzB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/os.ts"],"sourcesContent":["/**\n * Python os module for TypeScript\n *\n * Provides operating system interface functions matching Python's os module.\n * Note: This is a browser-compatible subset. Some functions are stubs.\n */\n\n// ============================================================================\n// Environment variables\n// ============================================================================\n\n/** Environment variables (browser-safe empty object or Node's process.env) */\nexport const environ: Record<string, string | undefined> =\n typeof process !== \"undefined\" ? process.env : {}\n\n/** Get an environment variable */\nexport function getenv(key: string, defaultValue?: string): string | undefined {\n return environ[key] ?? defaultValue\n}\n\n// ============================================================================\n// Path separator constants\n// ============================================================================\n\n/** Path separator for the current platform */\nexport const sep = typeof process !== \"undefined\" && process.platform === \"win32\" ? \"\\\\\" : \"/\"\n\n/** Alternative path separator (Windows has both / and \\) */\nexport const altsep = typeof process !== \"undefined\" && process.platform === \"win32\" ? \"/\" : null\n\n/** Path list separator (: on Unix, ; on Windows) */\nexport const pathsep = typeof process !== \"undefined\" && process.platform === \"win32\" ? \";\" : \":\"\n\n/** Line separator */\nexport const linesep =\n typeof process !== \"undefined\" && process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\"\n\n/** Current directory string */\nexport const curdir = \".\"\n\n/** Parent directory string */\nexport const pardir = \"..\"\n\n/** Extension separator */\nexport const extsep = \".\"\n\n// ============================================================================\n// os.path module\n// ============================================================================\n\nexport const path = {\n /** Join path components intelligently */\n join(...paths: string[]): string {\n if (paths.length === 0) return \"\"\n if (paths.length === 1) return paths[0] ?? \"\"\n\n let result = paths[0] ?? \"\"\n for (let i = 1; i < paths.length; i++) {\n const p = paths[i] ?? \"\"\n if (p.startsWith(\"/\") || (p.length > 1 && p[1] === \":\")) {\n // Absolute path - start fresh\n result = p\n } else if (result === \"\" || result.endsWith(\"/\") || result.endsWith(\"\\\\\")) {\n result += p\n } else {\n result += sep + p\n }\n }\n return result\n },\n\n /** Return the base name of pathname */\n basename(p: string, suffix?: string): string {\n // Remove trailing slashes\n let s = p.replace(/[/\\\\]+$/, \"\")\n // Get last component\n const idx = Math.max(s.lastIndexOf(\"/\"), s.lastIndexOf(\"\\\\\"))\n s = idx >= 0 ? s.slice(idx + 1) : s\n // Remove suffix if provided\n if (suffix && s.endsWith(suffix)) {\n s = s.slice(0, -suffix.length)\n }\n return s\n },\n\n /** Return the directory name of pathname */\n dirname(p: string): string {\n // Remove trailing slashes\n const s = p.replace(/[/\\\\]+$/, \"\")\n const idx = Math.max(s.lastIndexOf(\"/\"), s.lastIndexOf(\"\\\\\"))\n if (idx < 0) return \"\"\n if (idx === 0) return s[0] ?? \"\"\n return s.slice(0, idx)\n },\n\n /** Split pathname into (head, tail) */\n split(p: string): [string, string] {\n return [path.dirname(p), path.basename(p)]\n },\n\n /** Split pathname into root and extension */\n splitext(p: string): [string, string] {\n const base = path.basename(p)\n const dotIdx = base.lastIndexOf(\".\")\n if (dotIdx <= 0) {\n return [p, \"\"]\n }\n const dir = path.dirname(p)\n const root = base.slice(0, dotIdx)\n const ext = base.slice(dotIdx)\n return [dir ? path.join(dir, root) : root, ext]\n },\n\n /** Return the extension of pathname */\n extname(p: string): string {\n return path.splitext(p)[1]\n },\n\n /** Test whether a path is absolute */\n isabs(p: string): boolean {\n if (p.startsWith(\"/\")) return true\n // Windows: C:\\ or C:/\n if (p.length >= 3 && p[1] === \":\" && (p[2] === \"/\" || p[2] === \"\\\\\")) return true\n // Windows UNC: \\\\server\\share\n if (p.startsWith(\"\\\\\\\\\")) return true\n return false\n },\n\n /** Normalize a pathname */\n normpath(p: string): string {\n if (!p) return \".\"\n\n // Handle Windows drive letter\n let prefix = \"\"\n if (p.length >= 2 && p[1] === \":\") {\n prefix = p.slice(0, 2)\n p = p.slice(2)\n }\n\n // Replace backslashes with forward slashes for processing\n const isWin = p.includes(\"\\\\\")\n p = p.replace(/\\\\/g, \"/\")\n\n // Split and process\n const isAbsolute = p.startsWith(\"/\")\n const parts = p.split(\"/\").filter((part) => part && part !== \".\")\n const result: string[] = []\n\n for (const part of parts) {\n if (part === \"..\") {\n if (result.length > 0 && result[result.length - 1] !== \"..\") {\n result.pop()\n } else if (!isAbsolute) {\n result.push(\"..\")\n }\n } else {\n result.push(part)\n }\n }\n\n let normalized = result.join(isWin ? \"\\\\\" : \"/\")\n if (isAbsolute) {\n normalized = (isWin ? \"\\\\\" : \"/\") + normalized\n }\n normalized = prefix + normalized\n\n return normalized || \".\"\n },\n\n /** Return normalized absolutized version of pathname */\n abspath(p: string): string {\n if (path.isabs(p)) {\n return path.normpath(p)\n }\n // In browser, we can't get cwd, so just normalize\n return path.normpath(p)\n },\n\n /** Return canonical path, eliminating symlinks (stub - just normalizes) */\n realpath(p: string): string {\n return path.abspath(p)\n },\n\n /** Return relative path from start to path */\n relpath(p: string, start: string = \".\"): string {\n const pParts = path.normpath(p).split(/[/\\\\]/).filter(Boolean)\n const startParts = path.normpath(start).split(/[/\\\\]/).filter(Boolean)\n\n // Find common prefix length\n let commonLen = 0\n const minLen = Math.min(pParts.length, startParts.length)\n for (let i = 0; i < minLen; i++) {\n if (pParts[i] === startParts[i]) {\n commonLen++\n } else {\n break\n }\n }\n\n // Build relative path\n const upCount = startParts.length - commonLen\n const result = [...Array<string>(upCount).fill(\"..\"), ...pParts.slice(commonLen)]\n return result.join(sep) || \".\"\n },\n\n /** Return common path prefix */\n commonpath(paths: string[]): string {\n if (paths.length === 0) {\n throw new Error(\"commonpath() arg is an empty sequence\")\n }\n\n const splitPaths = paths.map((p) => path.normpath(p).split(/[/\\\\]/))\n const first = splitPaths[0] as string[]\n let commonLen = first.length\n\n for (let i = 1; i < splitPaths.length; i++) {\n const parts = splitPaths[i] as string[]\n commonLen = Math.min(commonLen, parts.length)\n for (let j = 0; j < commonLen; j++) {\n if (parts[j] !== first[j]) {\n commonLen = j\n break\n }\n }\n }\n\n return first.slice(0, commonLen).join(sep) || sep\n },\n\n /** Expand ~ and ~user (stub - returns unchanged in browser) */\n expanduser(p: string): string {\n if (!p.startsWith(\"~\")) return p\n const home =\n typeof process !== \"undefined\" ? (process.env.HOME ?? process.env.USERPROFILE) : undefined\n if (!home) return p\n if (p === \"~\" || p.startsWith(\"~/\") || p.startsWith(\"~\\\\\")) {\n return home + p.slice(1)\n }\n return p\n },\n\n /** Expand shell variables (stub - returns unchanged) */\n expandvars(p: string): string {\n // Simple $VAR and ${VAR} expansion\n return p.replace(/\\$(\\w+)|\\$\\{(\\w+)\\}/g, (_, v1: string, v2: string) => {\n const key = v1 || v2\n return environ[key] ?? \"\"\n })\n },\n\n /* eslint-disable @typescript-eslint/no-unused-vars */\n /** Test if path exists (stub - always returns false in browser) */\n exists(_p: string): boolean {\n return false\n },\n\n /** Test if path is a file (stub - always returns false in browser) */\n isfile(_p: string): boolean {\n return false\n },\n\n /** Test if path is a directory (stub - always returns false in browser) */\n isdir(_p: string): boolean {\n return false\n },\n\n /** Test if path is a symbolic link (stub - always returns false in browser) */\n islink(_p: string): boolean {\n return false\n },\n\n /** Return size of file (stub - returns 0 in browser) */\n getsize(_p: string): number {\n return 0\n },\n\n /** Return modification time (stub - returns 0 in browser) */\n getmtime(_p: string): number {\n return 0\n },\n\n /** Return access time (stub - returns 0 in browser) */\n getatime(_p: string): number {\n return 0\n },\n\n /** Return creation time (stub - returns 0 in browser) */\n getctime(_p: string): number {\n return 0\n }\n /* eslint-enable @typescript-eslint/no-unused-vars */\n}\n\n// ============================================================================\n// Process functions (stubs for browser compatibility)\n// ============================================================================\n\n/** Get current working directory */\nexport function getcwd(): string {\n if (typeof process !== \"undefined\") {\n return process.cwd()\n }\n return \"/\"\n}\n\n/** Get current working directory as bytes (same as getcwd in TS) */\nexport function getcwdb(): string {\n return getcwd()\n}\n\n/** Change current working directory (stub in browser) */\nexport function chdir(p: string): void {\n if (typeof process !== \"undefined\") {\n process.chdir(p)\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/** List directory contents (stub - returns empty array in browser) */\nexport function listdir(_p: string = \".\"): string[] {\n return []\n}\n\n/** Create a directory (stub in browser) */\nexport function mkdir(_p: string, _mode: number = 0o777): void {\n // No-op in browser\n}\n\n/** Create a directory and parents (stub in browser) */\nexport function makedirs(_p: string, _mode: number = 0o777, _existOk: boolean = false): void {\n // No-op in browser\n}\n\n/** Remove a file (stub in browser) */\nexport function remove(_p: string): void {\n // No-op in browser\n}\n\n/** Remove a file (alias for remove) */\nexport const unlink = remove\n\n/** Remove a directory (stub in browser) */\nexport function rmdir(_p: string): void {\n // No-op in browser\n}\n\n/** Remove directory tree (stub in browser) */\nexport function removedirs(_p: string): void {\n // No-op in browser\n}\n\n/** Rename a file or directory (stub in browser) */\nexport function rename(_src: string, _dst: string): void {\n // No-op in browser\n}\n\n/** Rename with automatic directory creation (stub in browser) */\nexport function renames(_src: string, _dst: string): void {\n // No-op in browser\n}\n\n/** Replace file (stub in browser) */\nexport function replace(_src: string, _dst: string): void {\n // No-op in browser\n}\n\n/** Walk directory tree (stub - yields nothing in browser) */\nexport function* walk(\n _top: string,\n _options?: { topdown?: boolean; followlinks?: boolean }\n): Generator<[string, string[], string[]]> {\n // No-op in browser\n}\n\n/** Get file stat (stub in browser) */\nexport function stat(_p: string): {\n st_mode: number\n st_size: number\n st_mtime: number\n st_atime: number\n st_ctime: number\n} {\n return { st_mode: 0, st_size: 0, st_mtime: 0, st_atime: 0, st_ctime: 0 }\n}\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\n// ============================================================================\n// Name and platform info\n// ============================================================================\n\n/** Operating system name */\nexport const name: string =\n typeof process !== \"undefined\" && process.platform === \"win32\" ? \"nt\" : \"posix\"\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/itertools.ts"],"sourcesContent":["/**\n * Python itertools module for TypeScript\n *\n * Provides iterator building blocks inspired by Python's itertools module.\n *\n * Design Decision (ADR-0008):\n * - Most functions return eager arrays for better debugging and familiarity\n * - Only infinite sequences (cycle, repeat without count) use generators\n */\n\n/**\n * Chain multiple iterables together into a single array\n * chain([1, 2], [3, 4]) -> [1, 2, 3, 4]\n */\nexport function chain<T>(...iterables: Iterable<T>[]): T[] {\n return iterables.flatMap((it) => [...it])\n}\n\n/**\n * Return successive r-length combinations of elements\n * combinations([1, 2, 3], 2) -> [[1, 2], [1, 3], [2, 3]]\n */\nexport function combinations<T>(iterable: Iterable<T>, r: number): T[][] {\n const pool = [...iterable]\n const n = pool.length\n if (r > n || r < 0) return []\n\n const result: T[][] = []\n const indices: number[] = Array.from({ length: r }, (_, i) => i)\n result.push(indices.map((i) => pool[i] as T))\n\n for (;;) {\n let i = r - 1\n while (i >= 0 && indices[i] === i + n - r) i--\n if (i < 0) break\n ;(indices[i] as number)++\n for (let j = i + 1; j < r; j++) {\n indices[j] = (indices[j - 1] as number) + 1\n }\n result.push(indices.map((idx) => pool[idx] as T))\n }\n\n return result\n}\n\n/**\n * Return successive r-length permutations of elements\n * permutations([1, 2, 3], 2) -> [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]\n */\nexport function permutations<T>(iterable: Iterable<T>, r?: number): T[][] {\n const pool = [...iterable]\n const n = pool.length\n const rLen = r === undefined ? n : r\n if (rLen > n || rLen < 0) return []\n\n const result: T[][] = []\n const indices: number[] = Array.from({ length: n }, (_, i) => i)\n const cycles: number[] = Array.from({ length: rLen }, (_, i) => n - i)\n\n result.push(indices.slice(0, rLen).map((i) => pool[i] as T))\n\n outer: for (;;) {\n for (let i = rLen - 1; i >= 0; i--) {\n ;(cycles[i] as number)--\n if (cycles[i] === 0) {\n // Rotate indices[i:] left by one\n const temp = indices[i] as number\n for (let j = i; j < n - 1; j++) {\n indices[j] = indices[j + 1] as number\n }\n indices[n - 1] = temp\n cycles[i] = n - i\n } else {\n const j = n - (cycles[i] as number)\n const swap = indices[j] as number\n indices[j] = indices[i] as number\n indices[i] = swap\n result.push(indices.slice(0, rLen).map((idx) => pool[idx] as T))\n continue outer\n }\n }\n break\n }\n\n return result\n}\n\n/**\n * Cartesian product of input iterables\n * product([1, 2], ['a', 'b']) -> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]\n */\nexport function product<T>(...iterables: Iterable<T>[]): T[][] {\n if (iterables.length === 0) return [[]]\n\n const pools = iterables.map((it) => [...it])\n\n // Check if any pool is empty\n if (pools.some((p) => p.length === 0)) return []\n\n const result: T[][] = []\n const indices: number[] = new Array<number>(pools.length).fill(0)\n result.push(pools.map((p, i) => p[indices[i] as number] as T))\n\n for (;;) {\n let i = pools.length - 1\n while (i >= 0) {\n ;(indices[i] as number)++\n const currentPool = pools[i] as T[]\n if ((indices[i] as number) < currentPool.length) {\n result.push(pools.map((p, j) => p[indices[j] as number] as T))\n break\n }\n indices[i] = 0\n i--\n }\n if (i < 0) break\n }\n\n return result\n}\n\n/**\n * Cycle through an iterable indefinitely (INFINITE - returns Generator)\n * cycle([1, 2, 3]) -> 1, 2, 3, 1, 2, 3, 1, 2, 3, ...\n *\n * WARNING: This is infinite! Use with for...of and break, or islice.\n */\nexport function* cycle<T>(iterable: Iterable<T>): Generator<T> {\n const saved: T[] = []\n for (const element of iterable) {\n yield element\n saved.push(element)\n }\n if (saved.length === 0) return\n for (;;) {\n yield* saved\n }\n}\n\n/**\n * Repeat an object. If times is specified, returns an array. Otherwise returns\n * an infinite generator.\n *\n * repeat('x', 3) -> ['x', 'x', 'x']\n * repeat('x') -> Generator that yields 'x' forever (INFINITE)\n */\nexport function repeat<T>(obj: T, times?: number): T[] | Generator<T> {\n if (times !== undefined) {\n // Finite: return array\n return Array.from({ length: times }, () => obj)\n }\n // Infinite: return generator\n return (function* () {\n for (;;) {\n yield obj\n }\n })()\n}\n\n/**\n * Slice an iterable from start to stop with step\n * islice([1, 2, 3, 4, 5], 1, 4) -> [2, 3, 4]\n * islice([1, 2, 3, 4, 5], 3) -> [1, 2, 3]\n */\nexport function islice<T>(\n iterable: Iterable<T>,\n start: number,\n stop?: number,\n step: number = 1\n): T[] {\n // Handle single argument (stop only): islice(it, 5) means islice(it, 0, 5, 1)\n let actualStart = start\n let actualStop = stop\n if (actualStop === undefined) {\n actualStop = start\n actualStart = 0\n }\n\n if (step < 1) {\n throw new Error(\"step must be >= 1\")\n }\n\n const result: T[] = []\n let index = 0\n let nextIndex = actualStart\n\n for (const element of iterable) {\n if (index >= actualStop) break\n if (index === nextIndex) {\n result.push(element)\n nextIndex += step\n }\n index++\n }\n\n return result\n}\n\n/**\n * Take elements while predicate is true\n * takewhile(x => x < 5, [1, 4, 6, 4, 1]) -> [1, 4]\n */\nexport function takewhile<T>(predicate: (x: T) => boolean, iterable: Iterable<T>): T[] {\n const result: T[] = []\n for (const element of iterable) {\n if (predicate(element)) {\n result.push(element)\n } else {\n break\n }\n }\n return result\n}\n\n/**\n * Skip elements while predicate is true, then return the rest\n * dropwhile(x => x < 5, [1, 4, 6, 4, 1]) -> [6, 4, 1]\n */\nexport function dropwhile<T>(predicate: (x: T) => boolean, iterable: Iterable<T>): T[] {\n const result: T[] = []\n let dropping = true\n for (const element of iterable) {\n if (dropping && predicate(element)) {\n continue\n }\n dropping = false\n result.push(element)\n }\n return result\n}\n\n/**\n * Zip iterables together, filling missing values with fillvalue\n * zip_longest([1, 2, 3], ['a', 'b'], { fillvalue: '-' }) -> [[1, 'a'], [2, 'b'], [3, '-']]\n */\nexport function zip_longest<T>(\n ...args: [...Iterable<T>[], { fillvalue?: T }] | Iterable<T>[]\n): T[][] {\n let fillvalue: T | undefined\n let iterables: Iterable<T>[]\n\n // Check if last argument is options object\n const lastArg = args[args.length - 1]\n if (\n lastArg &&\n typeof lastArg === \"object\" &&\n !Array.isArray(lastArg) &&\n !(Symbol.iterator in lastArg)\n ) {\n fillvalue = (lastArg as { fillvalue?: T }).fillvalue\n iterables = args.slice(0, -1) as Iterable<T>[]\n } else {\n iterables = args as Iterable<T>[]\n }\n\n if (iterables.length === 0) return []\n\n const arrays = iterables.map((it) => [...it])\n const maxLen = Math.max(...arrays.map((a) => a.length))\n const result: T[][] = []\n\n for (let i = 0; i < maxLen; i++) {\n const tuple: T[] = []\n for (const arr of arrays) {\n tuple.push(i < arr.length ? (arr[i] as T) : (fillvalue as T))\n }\n result.push(tuple)\n }\n\n return result\n}\n\n/**\n * Return elements from iterable where the corresponding selector is true\n * compress([1, 2, 3, 4, 5], [1, 0, 1, 0, 1]) -> [1, 3, 5]\n */\nexport function compress<T>(data: Iterable<T>, selectors: Iterable<unknown>): T[] {\n const result: T[] = []\n const dataArr = [...data]\n const selectorsArr = [...selectors]\n const len = Math.min(dataArr.length, selectorsArr.length)\n\n for (let i = 0; i < len; i++) {\n if (selectorsArr[i]) {\n result.push(dataArr[i] as T)\n }\n }\n return result\n}\n\n/**\n * Return elements for which predicate is false\n * filterfalse(x => x % 2, [1, 2, 3, 4, 5]) -> [2, 4]\n */\nexport function filterfalse<T>(predicate: (x: T) => unknown, iterable: Iterable<T>): T[] {\n const result: T[] = []\n for (const element of iterable) {\n if (!predicate(element)) {\n result.push(element)\n }\n }\n return result\n}\n\n/**\n * Make an iterator that returns accumulated sums or accumulated results\n * accumulate([1, 2, 3, 4, 5]) -> [1, 3, 6, 10, 15]\n * accumulate([1, 2, 3, 4, 5], (x, y) => x * y) -> [1, 2, 6, 24, 120]\n */\nexport function accumulate<T>(\n iterable: Iterable<T>,\n func?: (acc: T, val: T) => T,\n initial?: T\n): T[] {\n const result: T[] = []\n const arr = [...iterable]\n\n if (arr.length === 0) {\n if (initial !== undefined) {\n return [initial]\n }\n return []\n }\n\n const operation = func ?? ((a: T, b: T): T => ((a as number) + (b as number)) as unknown as T)\n\n let acc: T\n let startIdx: number\n\n if (initial !== undefined) {\n acc = initial\n startIdx = 0\n result.push(acc)\n } else {\n acc = arr[0] as T\n startIdx = 1\n result.push(acc)\n }\n\n for (let i = startIdx; i < arr.length; i++) {\n acc = operation(acc, arr[i] as T)\n result.push(acc)\n }\n\n return result\n}\n\n/**\n * Return consecutive keys and groups from the iterable\n * groupby([1, 1, 2, 2, 2, 3, 1, 1]) -> [[1, [1, 1]], [2, [2, 2, 2]], [3, [3]], [1, [1, 1]]]\n */\nexport function groupby<T, K = T>(iterable: Iterable<T>, key?: (x: T) => K): [K, T[]][] {\n const result: [K, T[]][] = []\n const keyFunc = key ?? ((x: T) => x as unknown as K)\n\n let currentKey: K | undefined\n let currentGroup: T[] = []\n let first = true\n\n for (const element of iterable) {\n const k = keyFunc(element)\n if (first) {\n currentKey = k\n currentGroup = [element]\n first = false\n } else if (k === currentKey) {\n currentGroup.push(element)\n } else {\n result.push([currentKey as K, currentGroup])\n currentKey = k\n currentGroup = [element]\n }\n }\n\n if (!first) {\n result.push([currentKey as K, currentGroup])\n }\n\n return result\n}\n\n/**\n * Make an iterator that returns evenly spaced values starting with n\n * count(10, 2) -> 10, 12, 14, 16, 18, ... (INFINITE Generator)\n */\nexport function* count(start: number = 0, step: number = 1): Generator<number> {\n let n = start\n for (;;) {\n yield n\n n += step\n }\n}\n\n/**\n * Return n independent iterators from a single iterable\n * tee([1, 2, 3], 2) -> [[1, 2, 3], [1, 2, 3]]\n */\nexport function tee<T>(iterable: Iterable<T>, n: number = 2): T[][] {\n const arr = [...iterable]\n return Array.from({ length: n }, () => [...arr])\n}\n\n/**\n * Return successive overlapping pairs from the iterable\n * pairwise([1, 2, 3, 4, 5]) -> [[1, 2], [2, 3], [3, 4], [4, 5]]\n */\nexport function pairwise<T>(iterable: Iterable<T>): [T, T][] {\n const arr = [...iterable]\n const result: [T, T][] = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i] as T, arr[i + 1] as T])\n }\n return result\n}\n\n/**\n * Cartesian product with repeat (product(range(3), repeat=2) like nested loops)\n * productRepeat([0, 1], 2) -> [[0, 0], [0, 1], [1, 0], [1, 1]]\n */\nexport function productRepeat<T>(iterable: Iterable<T>, repeat: number = 1): T[][] {\n const pool = [...iterable]\n if (repeat < 1 || pool.length === 0) return repeat === 0 ? [[]] : []\n\n const pools = Array.from({ length: repeat }, () => pool)\n return product(...pools)\n}\n\n/**\n * Return r-length combinations with replacement\n * combinations_with_replacement([1, 2, 3], 2) -> [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]\n */\nexport function combinations_with_replacement<T>(iterable: Iterable<T>, r: number): T[][] {\n const pool = [...iterable]\n const n = pool.length\n if (r < 0 || n === 0) return r === 0 ? [[]] : []\n\n const result: T[][] = []\n const indices: number[] = new Array<number>(r).fill(0)\n result.push(indices.map((i) => pool[i] as T))\n\n for (;;) {\n let i = r - 1\n while (i >= 0 && indices[i] === n - 1) i--\n if (i < 0) break\n const newVal = (indices[i] as number) + 1\n for (let j = i; j < r; j++) {\n indices[j] = newVal\n }\n result.push(indices.map((idx) => pool[idx] as T))\n }\n\n return result\n}\n"],"mappings":"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","names":["repeat"]}