morphir-python 0.0.1__py3-none-any.whl

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 (99) hide show
  1. morphir/__init__.py +14 -0
  2. morphir/ir/__init__.py +110 -0
  3. morphir/ir/access_controlled.py +15 -0
  4. morphir/ir/decorations.py +19 -0
  5. morphir/ir/diagnostics.py +105 -0
  6. morphir/ir/distribution.py +21 -0
  7. morphir/ir/document.py +37 -0
  8. morphir/ir/documented.py +11 -0
  9. morphir/ir/format_version.py +483 -0
  10. morphir/ir/fqname.py +9 -0
  11. morphir/ir/json.py +11 -0
  12. morphir/ir/literal.py +25 -0
  13. morphir/ir/meta.py +11 -0
  14. morphir/ir/migrate.py +1267 -0
  15. morphir/ir/module.py +17 -0
  16. morphir/ir/name.py +27 -0
  17. morphir/ir/package.py +15 -0
  18. morphir/ir/path.py +25 -0
  19. morphir/ir/qname.py +9 -0
  20. morphir/ir/ref.py +17 -0
  21. morphir/ir/type.py +37 -0
  22. morphir/ir/type_constraints.py +33 -0
  23. morphir/ir/type_def.py +19 -0
  24. morphir/ir/type_spec.py +25 -0
  25. morphir/ir/v3/__init__.py +64 -0
  26. morphir/ir/v3/_legacy_value.py +201 -0
  27. morphir/ir/v3/access_controlled.py +31 -0
  28. morphir/ir/v3/codec.py +1275 -0
  29. morphir/ir/v3/codec_v1.py +491 -0
  30. morphir/ir/v3/codec_v2.py +187 -0
  31. morphir/ir/v3/distribution.py +42 -0
  32. morphir/ir/v3/documented.py +13 -0
  33. morphir/ir/v3/fqname.py +30 -0
  34. morphir/ir/v3/literal.py +46 -0
  35. morphir/ir/v3/module.py +32 -0
  36. morphir/ir/v3/name.py +42 -0
  37. morphir/ir/v3/package.py +23 -0
  38. morphir/ir/v3/path.py +29 -0
  39. morphir/ir/v3/qname.py +16 -0
  40. morphir/ir/v3/type.py +126 -0
  41. morphir/ir/v3/value.py +235 -0
  42. morphir/ir/v4/__init__.py +160 -0
  43. morphir/ir/v4/access_controlled.py +17 -0
  44. morphir/ir/v4/annotation.py +75 -0
  45. morphir/ir/v4/codec.py +2161 -0
  46. morphir/ir/v4/decorations.py +88 -0
  47. morphir/ir/v4/distribution.py +56 -0
  48. morphir/ir/v4/document.py +69 -0
  49. morphir/ir/v4/documented.py +10 -0
  50. morphir/ir/v4/fqname.py +69 -0
  51. morphir/ir/v4/incompleteness.py +78 -0
  52. morphir/ir/v4/json.py +103 -0
  53. morphir/ir/v4/literal.py +51 -0
  54. morphir/ir/v4/meta.py +27 -0
  55. morphir/ir/v4/module.py +30 -0
  56. morphir/ir/v4/name.py +69 -0
  57. morphir/ir/v4/package.py +19 -0
  58. morphir/ir/v4/path.py +50 -0
  59. morphir/ir/v4/qname.py +34 -0
  60. morphir/ir/v4/ref.py +35 -0
  61. morphir/ir/v4/type.py +140 -0
  62. morphir/ir/v4/type_constraints.py +91 -0
  63. morphir/ir/v4/type_def.py +38 -0
  64. morphir/ir/v4/type_spec.py +64 -0
  65. morphir/ir/v4/value.py +480 -0
  66. morphir/ir/value.py +81 -0
  67. morphir/py.typed +0 -0
  68. morphir/sdk/__init__.py +110 -0
  69. morphir/sdk/_compare.py +187 -0
  70. morphir/sdk/aggregate.py +421 -0
  71. morphir/sdk/basics.py +504 -0
  72. morphir/sdk/char.py +110 -0
  73. morphir/sdk/decimal.py +311 -0
  74. morphir/sdk/dict.py +336 -0
  75. morphir/sdk/instant.py +118 -0
  76. morphir/sdk/int.py +86 -0
  77. morphir/sdk/key.py +522 -0
  78. morphir/sdk/list.py +356 -0
  79. morphir/sdk/local_date.py +436 -0
  80. morphir/sdk/local_time.py +267 -0
  81. morphir/sdk/maybe.py +135 -0
  82. morphir/sdk/number.py +237 -0
  83. morphir/sdk/regex.py +287 -0
  84. morphir/sdk/result.py +162 -0
  85. morphir/sdk/result_list.py +169 -0
  86. morphir/sdk/rule.py +103 -0
  87. morphir/sdk/set.py +214 -0
  88. morphir/sdk/stateful_app.py +49 -0
  89. morphir/sdk/string.py +427 -0
  90. morphir/sdk/tuple.py +43 -0
  91. morphir/sdk/uuid.py +209 -0
  92. morphir_python-0.0.1.dist-info/METADATA +269 -0
  93. morphir_python-0.0.1.dist-info/RECORD +99 -0
  94. morphir_python-0.0.1.dist-info/WHEEL +4 -0
  95. morphir_python-0.0.1.dist-info/entry_points.txt +2 -0
  96. morphir_python-0.0.1.dist-info/licenses/LICENSE +201 -0
  97. morphir_tools/__init__.py +13 -0
  98. morphir_tools/cli.py +223 -0
  99. morphir_tools/py.typed +0 -0
morphir/sdk/key.py ADDED
@@ -0,0 +1,522 @@
1
+ """Morphir.SDK.Key: helpers for composite keys.
2
+
3
+ Elm needs this module because only tuples of comparables are comparable, a tuple
4
+ has at most three elements, and the unit value is not comparable. `key2` to
5
+ `key16` build a composite key from a row with one getter function for each
6
+ element:
7
+
8
+ >>> from dataclasses import dataclass
9
+ >>> from morphir.sdk import key as Key
10
+ >>> @dataclass(frozen=True)
11
+ ... class Trade:
12
+ ... desk: str
13
+ ... product: str
14
+ ... quantity: int
15
+ >>> Key.key2(lambda t: t.desk, lambda t: t.product, Trade("fx", "spot", 10))
16
+ ('fx', 'spot')
17
+
18
+ A composite key is a tuple, so `basics.compare` gives it a structural order and
19
+ it works as a `Dict` key or a `Set` member when its elements are comparable.
20
+
21
+ Elm nests the tuples of `Key4` and larger (`( k1, k2, ( k3, k4 ) )`), because an
22
+ Elm tuple has at most three elements. Python has no such limit, so every key
23
+ here is one flat tuple. The order of two keys is the same in the two forms.
24
+
25
+ `Key0` is the key with zero elements. It is the integer 0, as in Elm, so that it
26
+ stays comparable. `no_key` and `key0` yield it.
27
+
28
+ The functions are not curried. To get a key function of one argument, for
29
+ example for `aggregate.by_key`, use a `lambda` or `functools.partial`:
30
+
31
+ >>> from functools import partial
32
+ >>> desk_and_product = partial(Key.key2, lambda t: t.desk, lambda t: t.product)
33
+ >>> desk_and_product(Trade("fx", "swap", 5))
34
+ ('fx', 'swap')
35
+ """
36
+
37
+ from typing import TYPE_CHECKING
38
+
39
+ if TYPE_CHECKING:
40
+ from collections.abc import Callable
41
+
42
+ __all__ = [
43
+ "Key0",
44
+ "Key2",
45
+ "Key3",
46
+ "Key4",
47
+ "Key5",
48
+ "Key6",
49
+ "Key7",
50
+ "Key8",
51
+ "Key9",
52
+ "Key10",
53
+ "Key11",
54
+ "Key12",
55
+ "Key13",
56
+ "Key14",
57
+ "Key15",
58
+ "Key16",
59
+ "key0",
60
+ "key2",
61
+ "key3",
62
+ "key4",
63
+ "key5",
64
+ "key6",
65
+ "key7",
66
+ "key8",
67
+ "key9",
68
+ "key10",
69
+ "key11",
70
+ "key12",
71
+ "key13",
72
+ "key14",
73
+ "key15",
74
+ "key16",
75
+ "no_key",
76
+ ]
77
+
78
+ type Key0 = int
79
+ """A key with zero elements. The only value is 0."""
80
+
81
+ type Key2[K1, K2] = tuple[K1, K2]
82
+ """A composite key with 2 elements."""
83
+
84
+ type Key3[K1, K2, K3] = tuple[K1, K2, K3]
85
+ """A composite key with 3 elements."""
86
+
87
+ type Key4[K1, K2, K3, K4] = tuple[K1, K2, K3, K4]
88
+ """A composite key with 4 elements."""
89
+
90
+ type Key5[K1, K2, K3, K4, K5] = tuple[K1, K2, K3, K4, K5]
91
+ """A composite key with 5 elements."""
92
+
93
+ type Key6[K1, K2, K3, K4, K5, K6] = tuple[K1, K2, K3, K4, K5, K6]
94
+ """A composite key with 6 elements."""
95
+
96
+ type Key7[K1, K2, K3, K4, K5, K6, K7] = tuple[K1, K2, K3, K4, K5, K6, K7]
97
+ """A composite key with 7 elements."""
98
+
99
+ type Key8[K1, K2, K3, K4, K5, K6, K7, K8] = tuple[K1, K2, K3, K4, K5, K6, K7, K8]
100
+ """A composite key with 8 elements."""
101
+
102
+ type Key9[K1, K2, K3, K4, K5, K6, K7, K8, K9] = tuple[
103
+ K1, K2, K3, K4, K5, K6, K7, K8, K9
104
+ ]
105
+ """A composite key with 9 elements."""
106
+
107
+ type Key10[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10] = tuple[
108
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10
109
+ ]
110
+ """A composite key with 10 elements."""
111
+
112
+ type Key11[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11] = tuple[
113
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11
114
+ ]
115
+ """A composite key with 11 elements."""
116
+
117
+ type Key12[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12] = tuple[
118
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12
119
+ ]
120
+ """A composite key with 12 elements."""
121
+
122
+ type Key13[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13] = tuple[
123
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13
124
+ ]
125
+ """A composite key with 13 elements."""
126
+
127
+ type Key14[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14] = tuple[
128
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14
129
+ ]
130
+ """A composite key with 14 elements."""
131
+
132
+ type Key15[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14, K15] = tuple[
133
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14, K15
134
+ ]
135
+ """A composite key with 15 elements."""
136
+
137
+ type Key16[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14, K15, K16] = (
138
+ tuple[K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14, K15, K16]
139
+ )
140
+ """A composite key with 16 elements."""
141
+
142
+
143
+ def no_key(a: object) -> Key0:
144
+ """Create a key with zero elements. The row is ignored; the key is always 0."""
145
+ return 0
146
+
147
+
148
+ def key0(a: object) -> Key0:
149
+ """Create a key with zero elements. The row is ignored; the key is always 0."""
150
+ return 0
151
+
152
+
153
+ def key2[A, B1, B2](
154
+ get_key1: Callable[[A], B1],
155
+ get_key2: Callable[[A], B2],
156
+ a: A,
157
+ ) -> Key2[B1, B2]:
158
+ """Create a composite key with 2 elements from a row."""
159
+ return (get_key1(a), get_key2(a))
160
+
161
+
162
+ def key3[A, B1, B2, B3](
163
+ get_key1: Callable[[A], B1],
164
+ get_key2: Callable[[A], B2],
165
+ get_key3: Callable[[A], B3],
166
+ a: A,
167
+ ) -> Key3[B1, B2, B3]:
168
+ """Create a composite key with 3 elements from a row."""
169
+ return (get_key1(a), get_key2(a), get_key3(a))
170
+
171
+
172
+ def key4[A, B1, B2, B3, B4](
173
+ get_key1: Callable[[A], B1],
174
+ get_key2: Callable[[A], B2],
175
+ get_key3: Callable[[A], B3],
176
+ get_key4: Callable[[A], B4],
177
+ a: A,
178
+ ) -> Key4[B1, B2, B3, B4]:
179
+ """Create a composite key with 4 elements from a row."""
180
+ return (get_key1(a), get_key2(a), get_key3(a), get_key4(a))
181
+
182
+
183
+ def key5[A, B1, B2, B3, B4, B5](
184
+ get_key1: Callable[[A], B1],
185
+ get_key2: Callable[[A], B2],
186
+ get_key3: Callable[[A], B3],
187
+ get_key4: Callable[[A], B4],
188
+ get_key5: Callable[[A], B5],
189
+ a: A,
190
+ ) -> Key5[B1, B2, B3, B4, B5]:
191
+ """Create a composite key with 5 elements from a row."""
192
+ return (get_key1(a), get_key2(a), get_key3(a), get_key4(a), get_key5(a))
193
+
194
+
195
+ def key6[A, B1, B2, B3, B4, B5, B6](
196
+ get_key1: Callable[[A], B1],
197
+ get_key2: Callable[[A], B2],
198
+ get_key3: Callable[[A], B3],
199
+ get_key4: Callable[[A], B4],
200
+ get_key5: Callable[[A], B5],
201
+ get_key6: Callable[[A], B6],
202
+ a: A,
203
+ ) -> Key6[B1, B2, B3, B4, B5, B6]:
204
+ """Create a composite key with 6 elements from a row."""
205
+ return (
206
+ get_key1(a),
207
+ get_key2(a),
208
+ get_key3(a),
209
+ get_key4(a),
210
+ get_key5(a),
211
+ get_key6(a),
212
+ )
213
+
214
+
215
+ def key7[A, B1, B2, B3, B4, B5, B6, B7](
216
+ get_key1: Callable[[A], B1],
217
+ get_key2: Callable[[A], B2],
218
+ get_key3: Callable[[A], B3],
219
+ get_key4: Callable[[A], B4],
220
+ get_key5: Callable[[A], B5],
221
+ get_key6: Callable[[A], B6],
222
+ get_key7: Callable[[A], B7],
223
+ a: A,
224
+ ) -> Key7[B1, B2, B3, B4, B5, B6, B7]:
225
+ """Create a composite key with 7 elements from a row."""
226
+ return (
227
+ get_key1(a),
228
+ get_key2(a),
229
+ get_key3(a),
230
+ get_key4(a),
231
+ get_key5(a),
232
+ get_key6(a),
233
+ get_key7(a),
234
+ )
235
+
236
+
237
+ def key8[A, B1, B2, B3, B4, B5, B6, B7, B8](
238
+ get_key1: Callable[[A], B1],
239
+ get_key2: Callable[[A], B2],
240
+ get_key3: Callable[[A], B3],
241
+ get_key4: Callable[[A], B4],
242
+ get_key5: Callable[[A], B5],
243
+ get_key6: Callable[[A], B6],
244
+ get_key7: Callable[[A], B7],
245
+ get_key8: Callable[[A], B8],
246
+ a: A,
247
+ ) -> Key8[B1, B2, B3, B4, B5, B6, B7, B8]:
248
+ """Create a composite key with 8 elements from a row."""
249
+ return (
250
+ get_key1(a),
251
+ get_key2(a),
252
+ get_key3(a),
253
+ get_key4(a),
254
+ get_key5(a),
255
+ get_key6(a),
256
+ get_key7(a),
257
+ get_key8(a),
258
+ )
259
+
260
+
261
+ def key9[A, B1, B2, B3, B4, B5, B6, B7, B8, B9](
262
+ get_key1: Callable[[A], B1],
263
+ get_key2: Callable[[A], B2],
264
+ get_key3: Callable[[A], B3],
265
+ get_key4: Callable[[A], B4],
266
+ get_key5: Callable[[A], B5],
267
+ get_key6: Callable[[A], B6],
268
+ get_key7: Callable[[A], B7],
269
+ get_key8: Callable[[A], B8],
270
+ get_key9: Callable[[A], B9],
271
+ a: A,
272
+ ) -> Key9[B1, B2, B3, B4, B5, B6, B7, B8, B9]:
273
+ """Create a composite key with 9 elements from a row."""
274
+ return (
275
+ get_key1(a),
276
+ get_key2(a),
277
+ get_key3(a),
278
+ get_key4(a),
279
+ get_key5(a),
280
+ get_key6(a),
281
+ get_key7(a),
282
+ get_key8(a),
283
+ get_key9(a),
284
+ )
285
+
286
+
287
+ def key10[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10](
288
+ get_key1: Callable[[A], B1],
289
+ get_key2: Callable[[A], B2],
290
+ get_key3: Callable[[A], B3],
291
+ get_key4: Callable[[A], B4],
292
+ get_key5: Callable[[A], B5],
293
+ get_key6: Callable[[A], B6],
294
+ get_key7: Callable[[A], B7],
295
+ get_key8: Callable[[A], B8],
296
+ get_key9: Callable[[A], B9],
297
+ get_key10: Callable[[A], B10],
298
+ a: A,
299
+ ) -> Key10[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10]:
300
+ """Create a composite key with 10 elements from a row."""
301
+ return (
302
+ get_key1(a),
303
+ get_key2(a),
304
+ get_key3(a),
305
+ get_key4(a),
306
+ get_key5(a),
307
+ get_key6(a),
308
+ get_key7(a),
309
+ get_key8(a),
310
+ get_key9(a),
311
+ get_key10(a),
312
+ )
313
+
314
+
315
+ def key11[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11](
316
+ get_key1: Callable[[A], B1],
317
+ get_key2: Callable[[A], B2],
318
+ get_key3: Callable[[A], B3],
319
+ get_key4: Callable[[A], B4],
320
+ get_key5: Callable[[A], B5],
321
+ get_key6: Callable[[A], B6],
322
+ get_key7: Callable[[A], B7],
323
+ get_key8: Callable[[A], B8],
324
+ get_key9: Callable[[A], B9],
325
+ get_key10: Callable[[A], B10],
326
+ get_key11: Callable[[A], B11],
327
+ a: A,
328
+ ) -> Key11[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11]:
329
+ """Create a composite key with 11 elements from a row."""
330
+ return (
331
+ get_key1(a),
332
+ get_key2(a),
333
+ get_key3(a),
334
+ get_key4(a),
335
+ get_key5(a),
336
+ get_key6(a),
337
+ get_key7(a),
338
+ get_key8(a),
339
+ get_key9(a),
340
+ get_key10(a),
341
+ get_key11(a),
342
+ )
343
+
344
+
345
+ def key12[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12](
346
+ get_key1: Callable[[A], B1],
347
+ get_key2: Callable[[A], B2],
348
+ get_key3: Callable[[A], B3],
349
+ get_key4: Callable[[A], B4],
350
+ get_key5: Callable[[A], B5],
351
+ get_key6: Callable[[A], B6],
352
+ get_key7: Callable[[A], B7],
353
+ get_key8: Callable[[A], B8],
354
+ get_key9: Callable[[A], B9],
355
+ get_key10: Callable[[A], B10],
356
+ get_key11: Callable[[A], B11],
357
+ get_key12: Callable[[A], B12],
358
+ a: A,
359
+ ) -> Key12[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12]:
360
+ """Create a composite key with 12 elements from a row."""
361
+ return (
362
+ get_key1(a),
363
+ get_key2(a),
364
+ get_key3(a),
365
+ get_key4(a),
366
+ get_key5(a),
367
+ get_key6(a),
368
+ get_key7(a),
369
+ get_key8(a),
370
+ get_key9(a),
371
+ get_key10(a),
372
+ get_key11(a),
373
+ get_key12(a),
374
+ )
375
+
376
+
377
+ def key13[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13](
378
+ get_key1: Callable[[A], B1],
379
+ get_key2: Callable[[A], B2],
380
+ get_key3: Callable[[A], B3],
381
+ get_key4: Callable[[A], B4],
382
+ get_key5: Callable[[A], B5],
383
+ get_key6: Callable[[A], B6],
384
+ get_key7: Callable[[A], B7],
385
+ get_key8: Callable[[A], B8],
386
+ get_key9: Callable[[A], B9],
387
+ get_key10: Callable[[A], B10],
388
+ get_key11: Callable[[A], B11],
389
+ get_key12: Callable[[A], B12],
390
+ get_key13: Callable[[A], B13],
391
+ a: A,
392
+ ) -> Key13[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13]:
393
+ """Create a composite key with 13 elements from a row."""
394
+ return (
395
+ get_key1(a),
396
+ get_key2(a),
397
+ get_key3(a),
398
+ get_key4(a),
399
+ get_key5(a),
400
+ get_key6(a),
401
+ get_key7(a),
402
+ get_key8(a),
403
+ get_key9(a),
404
+ get_key10(a),
405
+ get_key11(a),
406
+ get_key12(a),
407
+ get_key13(a),
408
+ )
409
+
410
+
411
+ def key14[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14](
412
+ get_key1: Callable[[A], B1],
413
+ get_key2: Callable[[A], B2],
414
+ get_key3: Callable[[A], B3],
415
+ get_key4: Callable[[A], B4],
416
+ get_key5: Callable[[A], B5],
417
+ get_key6: Callable[[A], B6],
418
+ get_key7: Callable[[A], B7],
419
+ get_key8: Callable[[A], B8],
420
+ get_key9: Callable[[A], B9],
421
+ get_key10: Callable[[A], B10],
422
+ get_key11: Callable[[A], B11],
423
+ get_key12: Callable[[A], B12],
424
+ get_key13: Callable[[A], B13],
425
+ get_key14: Callable[[A], B14],
426
+ a: A,
427
+ ) -> Key14[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14]:
428
+ """Create a composite key with 14 elements from a row."""
429
+ return (
430
+ get_key1(a),
431
+ get_key2(a),
432
+ get_key3(a),
433
+ get_key4(a),
434
+ get_key5(a),
435
+ get_key6(a),
436
+ get_key7(a),
437
+ get_key8(a),
438
+ get_key9(a),
439
+ get_key10(a),
440
+ get_key11(a),
441
+ get_key12(a),
442
+ get_key13(a),
443
+ get_key14(a),
444
+ )
445
+
446
+
447
+ def key15[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15](
448
+ get_key1: Callable[[A], B1],
449
+ get_key2: Callable[[A], B2],
450
+ get_key3: Callable[[A], B3],
451
+ get_key4: Callable[[A], B4],
452
+ get_key5: Callable[[A], B5],
453
+ get_key6: Callable[[A], B6],
454
+ get_key7: Callable[[A], B7],
455
+ get_key8: Callable[[A], B8],
456
+ get_key9: Callable[[A], B9],
457
+ get_key10: Callable[[A], B10],
458
+ get_key11: Callable[[A], B11],
459
+ get_key12: Callable[[A], B12],
460
+ get_key13: Callable[[A], B13],
461
+ get_key14: Callable[[A], B14],
462
+ get_key15: Callable[[A], B15],
463
+ a: A,
464
+ ) -> Key15[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15]:
465
+ """Create a composite key with 15 elements from a row."""
466
+ return (
467
+ get_key1(a),
468
+ get_key2(a),
469
+ get_key3(a),
470
+ get_key4(a),
471
+ get_key5(a),
472
+ get_key6(a),
473
+ get_key7(a),
474
+ get_key8(a),
475
+ get_key9(a),
476
+ get_key10(a),
477
+ get_key11(a),
478
+ get_key12(a),
479
+ get_key13(a),
480
+ get_key14(a),
481
+ get_key15(a),
482
+ )
483
+
484
+
485
+ def key16[A, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15, B16](
486
+ get_key1: Callable[[A], B1],
487
+ get_key2: Callable[[A], B2],
488
+ get_key3: Callable[[A], B3],
489
+ get_key4: Callable[[A], B4],
490
+ get_key5: Callable[[A], B5],
491
+ get_key6: Callable[[A], B6],
492
+ get_key7: Callable[[A], B7],
493
+ get_key8: Callable[[A], B8],
494
+ get_key9: Callable[[A], B9],
495
+ get_key10: Callable[[A], B10],
496
+ get_key11: Callable[[A], B11],
497
+ get_key12: Callable[[A], B12],
498
+ get_key13: Callable[[A], B13],
499
+ get_key14: Callable[[A], B14],
500
+ get_key15: Callable[[A], B15],
501
+ get_key16: Callable[[A], B16],
502
+ a: A,
503
+ ) -> Key16[B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15, B16]:
504
+ """Create a composite key with 16 elements from a row."""
505
+ return (
506
+ get_key1(a),
507
+ get_key2(a),
508
+ get_key3(a),
509
+ get_key4(a),
510
+ get_key5(a),
511
+ get_key6(a),
512
+ get_key7(a),
513
+ get_key8(a),
514
+ get_key9(a),
515
+ get_key10(a),
516
+ get_key11(a),
517
+ get_key12(a),
518
+ get_key13(a),
519
+ get_key14(a),
520
+ get_key15(a),
521
+ get_key16(a),
522
+ )