koatl 0.3.17__tar.gz → 0.3.19__tar.gz

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 (153) hide show
  1. {koatl-0.3.17 → koatl-0.3.19}/Cargo.lock +1 -1
  2. {koatl-0.3.17 → koatl-0.3.19}/PKG-INFO +1 -1
  3. {koatl-0.3.17 → koatl-0.3.19}/koatl/Cargo.toml +1 -1
  4. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/iter.tl +15 -5
  5. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/placeholder.tl +5 -1
  6. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/test_iterable.tl +16 -14
  7. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/ast.rs +2 -1
  8. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/inference.rs +1 -1
  9. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/lift_cst.rs +2 -4
  10. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/resolve_scopes.rs +7 -4
  11. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/transform.rs +8 -18
  12. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/iter.tl +15 -5
  13. {koatl-0.3.17 → koatl-0.3.19}/Cargo.toml +0 -0
  14. {koatl-0.3.17 → koatl-0.3.19}/README.md +0 -0
  15. {koatl-0.3.17 → koatl-0.3.19}/koatl/.github/workflows/CI.yml +0 -0
  16. {koatl-0.3.17 → koatl-0.3.19}/koatl/.gitignore +0 -0
  17. {koatl-0.3.17 → koatl-0.3.19}/koatl/LICENSE +0 -0
  18. {koatl-0.3.17 → koatl-0.3.19}/koatl/README.md +0 -0
  19. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/__init__.py +0 -0
  20. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/__main__.py +0 -0
  21. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/cli.py +0 -0
  22. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/notebook/__init__.py +0 -0
  23. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/notebook/magic.py +0 -0
  24. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/prelude/__init__.tl +0 -0
  25. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/runtime/__init__.py +0 -0
  26. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/runtime/meta_finder.py +0 -0
  27. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/runtime/record.py +0 -0
  28. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/runtime/vattr.py +0 -0
  29. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/__init__.tl +0 -0
  30. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/__init__.tl +0 -0
  31. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/async.tl +0 -0
  32. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/base.tl +0 -0
  33. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/do.tl +0 -0
  34. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/env.tl +0 -0
  35. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/memo.tl +0 -0
  36. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/control/result.tl +0 -0
  37. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/data/__init__.tl +0 -0
  38. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/data/list.tl +0 -0
  39. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/data/record.tl +0 -0
  40. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/ext.tl +0 -0
  41. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/io.tl +0 -0
  42. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/json.tl +0 -0
  43. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/lazy_module.tl +0 -0
  44. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/pickle.tl +0 -0
  45. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/re.tl +0 -0
  46. {koatl-0.3.17 → koatl-0.3.19}/koatl/python/koatl/std/trait.py +0 -0
  47. {koatl-0.3.17 → koatl-0.3.19}/koatl/requirements.txt +0 -0
  48. {koatl-0.3.17 → koatl-0.3.19}/koatl/src/emit_py.rs +0 -0
  49. {koatl-0.3.17 → koatl-0.3.19}/koatl/src/lib.rs +0 -0
  50. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/conftest.py +0 -0
  51. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/arguments.tl +0 -0
  52. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/containers.tl +0 -0
  53. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/data.txt +0 -0
  54. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/decorators.tl +0 -0
  55. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/destructure-for-and-fn.tl +0 -0
  56. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/destructure.tl +0 -0
  57. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/escape_ident.tl +0 -0
  58. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/fstr.tl +0 -0
  59. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/functions.tl +0 -0
  60. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/generator.tl +0 -0
  61. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/if_expr.tl +0 -0
  62. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/imports.tl +0 -0
  63. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/imports2.tl +0 -0
  64. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/loops.tl +0 -0
  65. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/match.tl +0 -0
  66. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/nary-list.tl +0 -0
  67. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/precedence.tl +0 -0
  68. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/scopes.tl +0 -0
  69. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/semantic_whitespace.tl +0 -0
  70. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/short_circuit.tl +0 -0
  71. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/base/with.tl +0 -0
  72. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/async.tl +0 -0
  73. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/aug_assign.tl +0 -0
  74. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/coal.tl +0 -0
  75. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/env.tl +0 -0
  76. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/iterables.tl +0 -0
  77. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/list.tl +0 -0
  78. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/memo.tl +0 -0
  79. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/record.tl +0 -0
  80. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/result.tl +0 -0
  81. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/slice.tl +0 -0
  82. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/try.tl +0 -0
  83. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/prelude/virtual.tl +0 -0
  84. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/test_modules/module0.tl +0 -0
  85. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/test_modules/module1.tl +0 -0
  86. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/e2e/test_modules/module2.tl +0 -0
  87. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_mixed_defaults.tl +0 -0
  88. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_multiple_kwargs.tl +0 -0
  89. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_multiple_kwonly_markers.tl +0 -0
  90. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_multiple_posonly_markers.tl +0 -0
  91. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_multiple_varargs.tl +0 -0
  92. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_posonly_after_kwonly.tl +0 -0
  93. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/arguments_vararg_and_kwonly_marker.tl +0 -0
  94. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/fail-parse/unmatched_closing_delimiter.tl +0 -0
  95. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/arith.tl +0 -0
  96. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/assign.tl +0 -0
  97. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/block-comments.tl +0 -0
  98. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/deco.tl +0 -0
  99. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/func.tl +0 -0
  100. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/matches.tl +0 -0
  101. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/mutual-recursion.tl +0 -0
  102. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/numbers.tl +0 -0
  103. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/parse/operators.tl +0 -0
  104. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/test_e2e.py +0 -0
  105. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/test_parse.py +0 -0
  106. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/test_parse_fail.py +0 -0
  107. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/test_re.tl +0 -0
  108. {koatl-0.3.17 → koatl-0.3.19}/koatl/tests/util/__init__.py +0 -0
  109. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/Cargo.toml +0 -0
  110. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/ast_builder.rs +0 -0
  111. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/lib.rs +0 -0
  112. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/main.rs +0 -0
  113. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/py/ast.rs +0 -0
  114. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/py/ast_builder.rs +0 -0
  115. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/py/emit.rs +0 -0
  116. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/py/mod.rs +0 -0
  117. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/types.rs +0 -0
  118. {koatl-0.3.17 → koatl-0.3.19}/koatl-core/src/util.rs +0 -0
  119. {koatl-0.3.17 → koatl-0.3.19}/koatl-parser/Cargo.toml +0 -0
  120. {koatl-0.3.17 → koatl-0.3.19}/koatl-parser/src/cst.rs +0 -0
  121. {koatl-0.3.17 → koatl-0.3.19}/koatl-parser/src/lexer.rs +0 -0
  122. {koatl-0.3.17 → koatl-0.3.19}/koatl-parser/src/lib.rs +0 -0
  123. {koatl-0.3.17 → koatl-0.3.19}/koatl-parser/src/parser.rs +0 -0
  124. {koatl-0.3.17 → koatl-0.3.19}/koatl-parser/src/simple_fmt.rs +0 -0
  125. {koatl-0.3.17 → koatl-0.3.19}/pyproject.toml +0 -0
  126. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/__init__.py +0 -0
  127. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/__main__.py +0 -0
  128. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/cli.py +0 -0
  129. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/notebook/__init__.py +0 -0
  130. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/notebook/magic.py +0 -0
  131. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/prelude/__init__.tl +0 -0
  132. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/runtime/__init__.py +0 -0
  133. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/runtime/meta_finder.py +0 -0
  134. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/runtime/record.py +0 -0
  135. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/runtime/vattr.py +0 -0
  136. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/__init__.tl +0 -0
  137. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/__init__.tl +0 -0
  138. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/async.tl +0 -0
  139. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/base.tl +0 -0
  140. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/do.tl +0 -0
  141. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/env.tl +0 -0
  142. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/memo.tl +0 -0
  143. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/control/result.tl +0 -0
  144. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/data/__init__.tl +0 -0
  145. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/data/list.tl +0 -0
  146. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/data/record.tl +0 -0
  147. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/ext.tl +0 -0
  148. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/io.tl +0 -0
  149. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/json.tl +0 -0
  150. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/lazy_module.tl +0 -0
  151. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/pickle.tl +0 -0
  152. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/re.tl +0 -0
  153. {koatl-0.3.17 → koatl-0.3.19}/python/koatl/std/trait.py +0 -0
@@ -190,7 +190,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
190
190
 
191
191
  [[package]]
192
192
  name = "koatl"
193
- version = "0.3.17"
193
+ version = "0.3.19"
194
194
  dependencies = [
195
195
  "ariadne",
196
196
  "koatl-core",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: koatl
3
- Version: 0.3.17
3
+ Version: 0.3.19
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "koatl"
3
- version = "0.3.17"
3
+ version = "0.3.19"
4
4
  edition = "2021"
5
5
  homepage = "https://koatl.org"
6
6
 
@@ -84,16 +84,20 @@ export Iterable = class(Traversable, Trait):
84
84
 
85
85
  impl()
86
86
 
87
- flat_map = (self, f) => itertools.chain.from_iterable(self.map(f))
87
+ flat_map = (self, f=None) =>
88
+ if f === None:
89
+ itertools.chain.from_iterable(self.iter)
90
+ else:
91
+ itertools.chain.from_iterable(self.iter.map(f))
88
92
 
89
- reverse = self => reversed(list(self.iter))
93
+ reversed = self => reversed(list(self.iter))
90
94
 
91
- sort = (self, key=None, reverse=False) =>
95
+ sorted = (self, key=None, reverse=False) =>
92
96
  sorted(self.iter, key=key, reverse=reverse)
93
97
 
94
98
  copy = self => itertools.tee(self.iter)
95
99
 
96
- count = (self, f=None) =>
100
+ tally = (self, f=None) =>
97
101
  let acc = 0
98
102
  if f === None:
99
103
  for _ in self:
@@ -187,7 +191,7 @@ export Iterable = class(Traversable, Trait):
187
191
  impl()
188
192
 
189
193
  join = (self, sep="") =>
190
- sep.join(self.map(str))
194
+ sep.join(self.iter.map(str))
191
195
 
192
196
  sum = self =>
193
197
  let acc = 0
@@ -260,6 +264,12 @@ export Iterable = class(Traversable, Trait):
260
264
  list = self =>
261
265
  list(self.iter)
262
266
 
267
+ set = self =>
268
+ set(self.iter)
269
+
270
+ tuple = self =>
271
+ tuple(self.iter)
272
+
263
273
  dict = self =>
264
274
  dict(self.iter)
265
275
 
@@ -34,4 +34,8 @@ assert_eq(3 | f($), 6)
34
34
 
35
35
  assert_eq(3 | [$, 2, 3], [3, 2, 3])
36
36
  f = [$, 2, 3]
37
- assert_eq(f(3), [3, 2, 3])
37
+ assert_eq(f(3), [3, 2, 3])
38
+
39
+ # placeholder guard regression
40
+
41
+ assert_eq({}.($.__or__({1: 2}).__or__({3: 4})), {1: 2, 3: 4})
@@ -57,11 +57,14 @@ test_all = () =>
57
57
  assert_eq([].all(x => x > 0), True)
58
58
  assert_eq([True, True, True].all(x => x), True)
59
59
 
60
- test_count = () =>
61
- # count() works on Iterable trait via .iter
62
- assert_eq([1, 2, 3, 4, 5].iter.count(x => x > 2), 3)
63
- assert_eq([1, 2, 3, 4, 5].iter.count(x => x %% 2 == 0), 2)
64
- assert_eq([1, 2, 3].iter.count(x => x > 10), 0)
60
+ test_tally = () =>
61
+ # tally() works on Iterable trait via .iter
62
+ assert_eq([1, 2, 3, 4, 5].iter.tally(), 5)
63
+ assert_eq([].iter.tally(), 0)
64
+ assert_eq((..10).tally(), 10)
65
+ assert_eq([1, 2, 3, 4, 5].iter.tally(x => x > 2), 3)
66
+ assert_eq([1, 2, 3, 4, 5].iter.tally(x => x %% 2 == 0), 2)
67
+ assert_eq([1, 2, 3].iter.tally(x => x > 10), 0)
65
68
 
66
69
  test_take = () =>
67
70
  assert_eq([1, 2, 3, 4, 5].take(3).list(), [1, 2, 3])
@@ -104,16 +107,15 @@ test_cycle = () =>
104
107
  assert_eq([1, 2, 3].cycle().take(7).list(), [1, 2, 3, 1, 2, 3, 1])
105
108
  assert_eq([5].cycle().take(3).list(), [5, 5, 5])
106
109
 
107
- test_reverse = () =>
108
- # reverse() is a method on Iterable trait, accessed via .iter
109
- assert_eq(list([1, 2, 3, 4, 5].iter.reverse()), [5, 4, 3, 2, 1])
110
- assert_eq(list([1].iter.reverse()), [1])
111
- assert_eq(list([].iter.reverse()), [])
110
+ test_reversed = () =>
111
+ assert_eq(list([1, 2, 3, 4, 5].reversed()), [5, 4, 3, 2, 1])
112
+ assert_eq(list([1].reversed()), [1])
113
+ assert_eq(list([].reversed()), [])
112
114
 
113
- test_sort = () =>
114
- assert_eq([3, 1, 4, 1, 5].iter.sort().list(), [1, 1, 3, 4, 5])
115
- assert_eq(["c", "a", "b"].iter.sort().list(), ["a", "b", "c"])
116
- assert_eq([].iter.sort().list(), [])
115
+ test_sorted = () =>
116
+ assert_eq([3, 1, 4, 1, 5].iter.sorted().list(), [1, 1, 3, 4, 5])
117
+ assert_eq(["c", "a", "b"].iter.sorted().list(), ["a", "b", "c"])
118
+ assert_eq([].iter.sorted().list(), [])
117
119
 
118
120
  test_join = () =>
119
121
  assert_eq(["a", "b", "c"].join(", "), "a, b, c")
@@ -186,15 +186,16 @@ pub enum Expr<'a, TTree: Tree> {
186
186
  Call(TTree::Expr, Vec<CallItem<'a, TTree>>),
187
187
  Subscript(TTree::Expr, Vec<ListItem<TTree>>),
188
188
  RawAttribute(TTree::Expr, SIdent<'a>),
189
+ ScopedAttribute(TTree::Expr, TTree::Expr),
189
190
  Attribute(TTree::Expr, SIdent<'a>),
190
191
  MaybeAttribute(TTree::Expr, SIdent<'a>),
191
192
 
192
193
  MappedCall(TTree::Expr, Vec<CallItem<'a, TTree>>),
193
194
  MappedSubscript(TTree::Expr, Vec<ListItem<TTree>>),
194
195
  MappedRawAttribute(TTree::Expr, SIdent<'a>),
196
+ MappedScopedAttribute(TTree::Expr, TTree::Expr),
195
197
  MappedAttribute(TTree::Expr, SIdent<'a>),
196
198
  MappedMaybeAttribute(TTree::Expr, SIdent<'a>),
197
- CallNullable(TTree::Expr, TTree::Expr),
198
199
 
199
200
  Try(TTree::Expr, Vec<MatchCase<TTree>>, Option<TTree::Expr>),
200
201
  Checked(TTree::Expr, Option<TTree::Pattern>),
@@ -235,7 +235,7 @@ impl<'src, 'ast> SExprExt<'src, 'ast> for Indirect<SExpr<'src>> {
235
235
  expr.traverse(ctx);
236
236
  Type::Any
237
237
  }
238
- Expr::CallNullable(expr, func) => {
238
+ Expr::ScopedAttribute(expr, func) | Expr::MappedScopedAttribute(expr, func) => {
239
239
  expr.traverse(ctx);
240
240
  func.traverse(ctx);
241
241
  Type::Any
@@ -379,11 +379,9 @@ impl<'src, 'tok> Lift<Indirect<ast::SExpr<'src>>> for cst::SExpr<'src, 'tok> {
379
379
  ..
380
380
  } => {
381
381
  if question.is_some() {
382
- ast::Expr::CallNullable(expr.lift(), rhs.lift())
382
+ ast::Expr::MappedScopedAttribute(expr.lift(), rhs.lift())
383
383
  } else {
384
- let func = rhs.lift();
385
- let arg = ast::CallItem::Arg(expr.lift());
386
- ast::Expr::Call(func, vec![arg])
384
+ ast::Expr::ScopedAttribute(expr.lift(), rhs.lift())
387
385
  }
388
386
  }
389
387
  cst::Expr::Decorated {
@@ -1442,14 +1442,14 @@ impl<'src> SExprExt<'src> for Indirect<SExpr<'src>> {
1442
1442
 
1443
1443
  return traversed;
1444
1444
  }
1445
- Expr::Call(a, items) => {
1446
- Expr::Call(a.traverse_guarded(state), traverse_call_items(state, items))
1445
+ Expr::ScopedAttribute(expr, value) => {
1446
+ Expr::ScopedAttribute(expr.traverse(state), value.traverse_guarded(state))
1447
1447
  }
1448
- Expr::CallNullable(expr, value) => {
1448
+ Expr::MappedScopedAttribute(expr, value) => {
1449
1449
  let (rhs, fn_ctx) =
1450
1450
  with_phantom_fninfo(state, span, |state| value.traverse_guarded(state));
1451
1451
 
1452
- let traversed = Expr::CallNullable(expr.traverse(state), rhs)
1452
+ let traversed = Expr::MappedScopedAttribute(expr.traverse(state), rhs)
1453
1453
  .spanned(span)
1454
1454
  .indirect();
1455
1455
 
@@ -1459,6 +1459,9 @@ impl<'src> SExprExt<'src> for Indirect<SExpr<'src>> {
1459
1459
 
1460
1460
  return traversed;
1461
1461
  }
1462
+ Expr::Call(a, items) => {
1463
+ Expr::Call(a.traverse(state), traverse_call_items(state, items))
1464
+ }
1462
1465
  Expr::MappedCall(a, call_items) => {
1463
1466
  let (rhs, fn_ctx) = with_phantom_fninfo(state, span, |state| {
1464
1467
  traverse_call_items(state, call_items)
@@ -1425,11 +1425,13 @@ fn transform_postfix_expr<'src, 'ast>(
1425
1425
  Expr::RawAttribute(obj, _) => (false, obj),
1426
1426
  Expr::Subscript(obj, _) => (false, obj),
1427
1427
  Expr::Call(obj, _) => (false, obj),
1428
+ Expr::ScopedAttribute(obj, _) => (false, obj),
1428
1429
  Expr::Attribute(obj, _) => (false, obj),
1429
1430
  Expr::MaybeAttribute(obj, _) => (false, obj),
1430
1431
  Expr::MappedRawAttribute(obj, _) => (true, obj),
1431
1432
  Expr::MappedSubscript(obj, _) => (true, obj),
1432
1433
  Expr::MappedCall(obj, _) => (true, obj),
1434
+ Expr::MappedScopedAttribute(obj, _) => (true, obj),
1433
1435
  Expr::MappedAttribute(obj, _) => (true, obj),
1434
1436
  Expr::MappedMaybeAttribute(obj, _) => (true, obj),
1435
1437
  _ => {
@@ -1460,6 +1462,10 @@ fn transform_postfix_expr<'src, 'ast>(
1460
1462
  let t = inner_pre.bind(transform_subscript_items(ctx, &list, &expr.span)?);
1461
1463
  a.subscript(lhs, t, access_ctx)
1462
1464
  }
1465
+ Expr::ScopedAttribute(_, rhs) | Expr::MappedScopedAttribute(_, rhs) => {
1466
+ let t = inner_pre.bind(rhs.transform(ctx)?);
1467
+ a.call(t, vec![PyCallItem::Arg(lhs)])
1468
+ }
1463
1469
  Expr::RawAttribute(_, attr) | Expr::MappedRawAttribute(_, attr) => {
1464
1470
  a.attribute(lhs, attr.value.escape(), access_ctx)
1465
1471
  }
@@ -2025,30 +2031,14 @@ impl<'src, 'ast> SExprExt<'src, 'ast> for SExpr<'src> {
2025
2031
  | Expr::MappedCall(..)
2026
2032
  | Expr::Subscript(..)
2027
2033
  | Expr::MappedSubscript(..)
2034
+ | Expr::ScopedAttribute(..)
2035
+ | Expr::MappedScopedAttribute(..)
2028
2036
  | Expr::Attribute(..)
2029
2037
  | Expr::MappedAttribute(..)
2030
2038
  | Expr::MaybeAttribute(..)
2031
2039
  | Expr::MappedMaybeAttribute(..) => {
2032
2040
  pre.bind(transform_postfix_expr(ctx, self, access_ctx)?)
2033
2041
  }
2034
- Expr::CallNullable(obj, func) => {
2035
- let a = PyAstBuilder::new(span);
2036
- let obj_transformed = pre.bind(obj.transform(ctx)?);
2037
- let func_transformed = pre.bind(func.transform(ctx)?);
2038
-
2039
- let maparg = ctx.create_aux_var("maparg", span.start);
2040
-
2041
- a.call(
2042
- a.tl_builtin("op_map"),
2043
- vec![
2044
- a.call_arg(obj_transformed),
2045
- a.call_arg(a.lambda(
2046
- PyArgList::simple_args(vec![(maparg.clone().into(), None)]),
2047
- a.call(func_transformed, vec![a.call_arg(a.load_ident(maparg))]),
2048
- )),
2049
- ],
2050
- )
2051
- }
2052
2042
  Expr::With(pattern, value, body) => {
2053
2043
  let temp_var = ctx.create_aux_var("with", span.start);
2054
2044
  let value = pre.bind(value.transform(ctx)?);
@@ -84,16 +84,20 @@ export Iterable = class(Traversable, Trait):
84
84
 
85
85
  impl()
86
86
 
87
- flat_map = (self, f) => itertools.chain.from_iterable(self.map(f))
87
+ flat_map = (self, f=None) =>
88
+ if f === None:
89
+ itertools.chain.from_iterable(self.iter)
90
+ else:
91
+ itertools.chain.from_iterable(self.iter.map(f))
88
92
 
89
- reverse = self => reversed(list(self.iter))
93
+ reversed = self => reversed(list(self.iter))
90
94
 
91
- sort = (self, key=None, reverse=False) =>
95
+ sorted = (self, key=None, reverse=False) =>
92
96
  sorted(self.iter, key=key, reverse=reverse)
93
97
 
94
98
  copy = self => itertools.tee(self.iter)
95
99
 
96
- count = (self, f=None) =>
100
+ tally = (self, f=None) =>
97
101
  let acc = 0
98
102
  if f === None:
99
103
  for _ in self:
@@ -187,7 +191,7 @@ export Iterable = class(Traversable, Trait):
187
191
  impl()
188
192
 
189
193
  join = (self, sep="") =>
190
- sep.join(self.map(str))
194
+ sep.join(self.iter.map(str))
191
195
 
192
196
  sum = self =>
193
197
  let acc = 0
@@ -260,6 +264,12 @@ export Iterable = class(Traversable, Trait):
260
264
  list = self =>
261
265
  list(self.iter)
262
266
 
267
+ set = self =>
268
+ set(self.iter)
269
+
270
+ tuple = self =>
271
+ tuple(self.iter)
272
+
263
273
  dict = self =>
264
274
  dict(self.iter)
265
275
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes