Skip to content

Commit 057765f

Browse files
split zip into two methods
1 parent 46f62cf commit 057765f

File tree

4 files changed

+210
-160
lines changed

4 files changed

+210
-160
lines changed

demo/index.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@
2727
<h1>Joint Iteration</h1>
2828
<p>This proposal is at Stage 2 of the TC39 process.</p>
2929
<p>Open the console to try it out. Here are some examples:</p>
30-
<pre><code>Array.from(Iterator.zip([
30+
<pre><code>Array.from(Iterator.zipToArrays([
3131
[0, 1, 2],
3232
[3, 4, 5],
3333
]))</code></pre>
34-
<pre><code>Array.from(Iterator.zip({
34+
<pre><code>Array.from(Iterator.zipToArrays({
3535
a: [0, 1, 2],
3636
b: [3, 4, 5, 6],
3737
c: [7, 8, 9],
3838
}))</code></pre>
39-
<pre><code>Array.from(Iterator.zip({
39+
<pre><code>Array.from(Iterator.zipToArrays({
4040
a: [0, 1, 2],
4141
b: [3, 4, 5, 6],
4242
c: [7, 8, 9],

spec.emu

+111-71
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ location: https://tc39.es/proposal-joint-iteration/
99
copyright: false
1010
</pre>
1111

12-
<emu-clause id="sec-iterator.zip">
13-
<h1>Iterator.zip ( _iterables_ [ , _options_ ] )</h1>
12+
<emu-clause id="sec-iterator.ziptoarrays">
13+
<h1>Iterator.zipToArrays ( _iterables_ [ , _options_ ] )</h1>
1414
<p>This method performs the following steps when called:</p>
1515
<emu-alg>
1616
1. If _iterables_ is not an Object, throw a *TypeError* exception.
@@ -27,77 +27,117 @@ copyright: false
2727
1. Let _iters_ be a new empty List.
2828
1. Let _openIters_ be a new empty List.
2929
1. Let _padding_ be a new empty List.
30-
1. If ? HasProperty(_iterables_, %Symbol.iterator%) is *true*, then
31-
1. Let _inputIter_ be ? GetIterator(_iterables_, ~sync~).
32-
1. Let _next_ be ~not-started~.
33-
1. Repeat, while _next_ is not ~done~,
34-
1. Set _next_ to Completion(IteratorStepValue(_inputIter_)).
35-
1. IfAbruptCloseIterators(_next_, _openIters_).
36-
1. If _next_ is not ~done~, then
37-
1. Let _iter_ be Completion(GetIteratorFlattenable(_next_, ~iterate-strings~)).
38-
1. IfAbruptCloseIterators(_iter_, the list-concatenation of « _inputIter_ » and _openIters_).
39-
1. Append _iter_ to _iters_.
40-
1. Append _iter_ to _openIters_.
41-
1. Let _iterCount_ be the number of elements in _iters_.
42-
1. If _mode_ is ~longest~, then
43-
1. If _paddingOption_ is *undefined*, then
44-
1. Perform the following steps _iterCount_ times:
45-
1. Append *undefined* to _padding_.
46-
1. Else,
47-
1. Let _paddingIter_ be Completion(GetIterator(_paddingOption_, ~sync~)).
48-
1. IfAbruptCloseIterators(_paddingIter_, _openIters_).
49-
1. Let _usingIterator_ be *true*.
50-
1. Perform the following steps _iterCount_ times:
51-
1. If _usingIterator_ is *true*, then
52-
1. Set _next_ to Completion(IteratorStepValue(_paddingIter_)).
53-
1. IfAbruptCloseIterators(_next_, _openIters_).
54-
1. If _next_ is ~done~, then
55-
1. Set _usingIterator_ to *false*.
56-
1. Else,
57-
1. Append _next_ to _padding_.
58-
1. If _usingIterator_ is *false*, append *undefined* to _padding_.
30+
1. Let _inputIter_ be ? GetIterator(_iterables_, ~sync~).
31+
1. Let _next_ be ~not-started~.
32+
1. Repeat, while _next_ is not ~done~,
33+
1. Set _next_ to Completion(IteratorStepValue(_inputIter_)).
34+
1. IfAbruptCloseIterators(_next_, _openIters_).
35+
1. If _next_ is not ~done~, then
36+
1. Let _iter_ be Completion(GetIteratorFlattenable(_next_, ~iterate-strings~)).
37+
1. IfAbruptCloseIterators(_iter_, the list-concatenation of « _inputIter_ » and _openIters_).
38+
1. Append _iter_ to _iters_.
39+
1. Append _iter_ to _openIters_.
40+
1. Let _iterCount_ be the number of elements in _iters_.
41+
1. If _mode_ is ~longest~, then
42+
1. If _paddingOption_ is *undefined*, then
43+
1. Perform the following steps _iterCount_ times:
44+
1. Append *undefined* to _padding_.
45+
1. Else,
46+
1. Let _paddingIter_ be Completion(GetIterator(_paddingOption_, ~sync~)).
47+
1. IfAbruptCloseIterators(_paddingIter_, _openIters_).
48+
1. Let _usingIterator_ be *true*.
49+
1. Perform the following steps _iterCount_ times:
5950
1. If _usingIterator_ is *true*, then
60-
1. Let _completion_ be Completion(IteratorClose(_paddingIter_, NormalCompletion(~unused~))).
61-
1. IfAbruptCloseIterators(_completion_, _openIters_).
62-
1. Let _finishResults_ be a new Abstract Closure with parameters (_results_) that captures nothing and performs the following steps when called:
63-
1. Return CreateArrayFromList(_results_).
64-
1. Else,
65-
1. Let _allKeys_ be ? _iterables_.[[OwnPropertyKeys]]().
66-
1. Let _keys_ be a new empty List.
67-
1. For each element _key_ of _allKeys_, do
68-
1. Let _desc_ be ? _iterables_.[[GetOwnProperty]](_key_).
69-
1. If _desc_ is not *undefined* and _desc_.[[Enumerable]] is *true*, then
70-
1. Let _value_ be *undefined*.
71-
1. If IsDataDescriptor(_desc_) is *true*, then
72-
1. Set _value_ to _desc_.[[Value]].
73-
1. Else,
74-
1. Assert: IsAccessorDescriptor(_desc_) is *true*.
75-
1. Let _getter_ be _desc_.[[Get]].
76-
1. If _getter_ is not *undefined*, then
77-
1. Let _getterResult_ be Completion(Call(_getter_, _iterables_)).
78-
1. IfAbruptCloseIterators(_getterResult_, _openIters_).
79-
1. Set _value_ to _getterResult_.
80-
1. If _value_ is not *undefined*, then
81-
1. Append _key_ to _keys_.
82-
1. Let _iter_ be Completion(GetIteratorFlattenable(_value_, ~iterate-strings~)).
83-
1. IfAbruptCloseIterators(_iter_, _openIters_).
84-
1. Append _iter_ to _iters_.
85-
1. Append _iter_ to _openIters_.
86-
1. Let _iterCount_ be the number of elements in _iters_.
87-
1. If _mode_ is ~longest~, then
88-
1. If _paddingOption_ is *undefined*, then
89-
1. Perform the following steps _iterCount_ times:
90-
1. Append *undefined* to _padding_.
51+
1. Set _next_ to Completion(IteratorStepValue(_paddingIter_)).
52+
1. IfAbruptCloseIterators(_next_, _openIters_).
53+
1. If _next_ is ~done~, then
54+
1. Set _usingIterator_ to *false*.
55+
1. Else,
56+
1. Append _next_ to _padding_.
57+
1. If _usingIterator_ is *false*, append *undefined* to _padding_.
58+
1. If _usingIterator_ is *true*, then
59+
1. Let _completion_ be Completion(IteratorClose(_paddingIter_, NormalCompletion(~unused~))).
60+
1. IfAbruptCloseIterators(_completion_, _openIters_).
61+
1. Let _finishResults_ be a new Abstract Closure with parameters (_results_) that captures nothing and performs the following steps when called:
62+
1. Return CreateArrayFromList(_results_).
63+
1. Return IteratorZipCore(_iters_, _openIters_, _mode_, _padding_, _finishResults_).
64+
</emu-alg>
65+
</emu-clause>
66+
67+
<emu-clause id="sec-iterator.ziptoobjects">
68+
<h1>Iterator.zipToObjects ( _iterables_ [ , _options_ ] )</h1>
69+
<p>This method performs the following steps when called:</p>
70+
<emu-alg>
71+
1. If _iterables_ is not an Object, throw a *TypeError* exception.
72+
1. Set _options_ to ? GetOptionsObject(_options_).
73+
1. Let _longest_ be ? GetOption(_options_, *"longest"*, ~boolean~, ~empty~, *false*).
74+
1. Let _strict_ be ? GetOption(_options_, *"strict"*, ~boolean~, ~empty~, *false*).
75+
1. If _longest_ is *true* and _strict_ is *true*, throw a *TypeError* exception.
76+
1. Let _mode_ be ~shortest~.
77+
1. Let _paddingOption_ be *undefined*.
78+
1. If _longest_ is *true*, then
79+
1. Set _mode_ to ~longest~.
80+
1. Set _paddingOption_ to ? Get(_options_, *"padding"*).
81+
1. If _strict_ is *true*, set _mode_ to ~strict~.
82+
1. Let _iters_ be a new empty List.
83+
1. Let _openIters_ be a new empty List.
84+
1. Let _padding_ be a new empty List.
85+
1. Let _allKeys_ be ? _iterables_.[[OwnPropertyKeys]]().
86+
1. Let _keys_ be a new empty List.
87+
1. For each element _key_ of _allKeys_, do
88+
1. Let _desc_ be ? _iterables_.[[GetOwnProperty]](_key_).
89+
1. If _desc_ is not *undefined* and _desc_.[[Enumerable]] is *true*, then
90+
1. Let _value_ be *undefined*.
91+
1. If IsDataDescriptor(_desc_) is *true*, then
92+
1. Set _value_ to _desc_.[[Value]].
9193
1. Else,
92-
1. For each element _key_ of _keys_, do
93-
1. Let _value_ be Completion(Get(_paddingOption_, _key_)).
94-
1. IfAbruptCloseIterators(_value_, _openIters_).
95-
1. Append _value_ to _padding_.
96-
1. Let _finishResults_ be a new Abstract Closure with parameters (_results_) that captures _keys_ and _iterCount_ and performs the following steps when called:
97-
1. Let _obj_ be OrdinaryObjectCreate(*null*).
98-
1. For each integer _i_ such that 0 ≤ _i_ &lt; _iterCount_, do
99-
1. Perform ! CreateDataPropertyOrThrow(_obj_, _keys_[_i_], _results_[_i_]).
100-
1. Return _obj_.
94+
1. Assert: IsAccessorDescriptor(_desc_) is *true*.
95+
1. Let _getter_ be _desc_.[[Get]].
96+
1. If _getter_ is not *undefined*, then
97+
1. Let _getterResult_ be Completion(Call(_getter_, _iterables_)).
98+
1. IfAbruptCloseIterators(_getterResult_, _openIters_).
99+
1. Set _value_ to _getterResult_.
100+
1. If _value_ is not *undefined*, then
101+
1. Append _key_ to _keys_.
102+
1. Let _iter_ be Completion(GetIteratorFlattenable(_value_, ~iterate-strings~)).
103+
1. IfAbruptCloseIterators(_iter_, _openIters_).
104+
1. Append _iter_ to _iters_.
105+
1. Append _iter_ to _openIters_.
106+
1. Let _iterCount_ be the number of elements in _iters_.
107+
1. If _mode_ is ~longest~, then
108+
1. If _paddingOption_ is *undefined*, then
109+
1. Perform the following steps _iterCount_ times:
110+
1. Append *undefined* to _padding_.
111+
1. Else,
112+
1. For each element _key_ of _keys_, do
113+
1. Let _value_ be Completion(Get(_paddingOption_, _key_)).
114+
1. IfAbruptCloseIterators(_value_, _openIters_).
115+
1. Append _value_ to _padding_.
116+
1. Let _finishResults_ be a new Abstract Closure with parameters (_results_) that captures _keys_ and _iterCount_ and performs the following steps when called:
117+
1. Let _obj_ be OrdinaryObjectCreate(*null*).
118+
1. For each integer _i_ such that 0 ≤ _i_ &lt; _iterCount_, do
119+
1. Perform ! CreateDataPropertyOrThrow(_obj_, _keys_[_i_], _results_[_i_]).
120+
1. Return _obj_.
121+
1. Return IteratorZipCore(_iters_, _openIters_, _mode_, _padding_, _finishResults_).
122+
</emu-alg>
123+
</emu-clause>
124+
125+
<emu-clause id="sec-IteratorZipCore" type="abstract operation">
126+
<h1>
127+
IteratorZipCore (
128+
_iters_: a List of Iterator Records,
129+
_openIters_: a List of Iterator Records,
130+
_mode_: either ~shortest~, ~longest~, or ~strict~,
131+
_padding_: a List of ECMAScript language values,
132+
_finishResults_: an Abstract Closure that takes a List of ECMAScript values and returns an ECMAScript value,
133+
): a Generator
134+
</h1>
135+
<dl class="header">
136+
<dt>description</dt>
137+
<dd>TODO</dd>
138+
</dl>
139+
<emu-alg>
140+
1. Let _iterCount_ be the number of elements in _iters_.
101141
1. Let _closure_ be a new Abstract Closure with no parameters that captures _iters_, _iterCount_, _openIters_, _mode_, _padding_, and _finishResults_, and performs the following steps when called:
102142
1. Repeat,
103143
1. Let _results_ be a new empty List.

0 commit comments

Comments
 (0)