Skip to content

Commit 9481f51

Browse files
authored
Merge pull request #21 from fink-lang/nex-gen-iter
feat(iter): upgrade to runtime iterables impl.
2 parents 121997b + c233db7 commit 9481f51

File tree

7 files changed

+27733
-11278
lines changed

7 files changed

+27733
-11278
lines changed

jest.config.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ export default {
44
setupFiles: [],
55
moduleFileExtensions: ['js', 'fnk'],
66
transform: {
7-
'^.+\\.fnk$': ['@fink/jest/transform.js']
7+
'^.+\\.fnk$': ['@fink/jest/transform.js'],
8+
'^.+\\.js$': [
9+
'babel-jest',
10+
{presets: [['@babel/preset-env', {targets: {node: 'current'}}]]}
11+
]
812
},
913
transformIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/build/'],
1014

package-lock.json

Lines changed: 27397 additions & 11063 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@
4343
"release": "semantic-release"
4444
},
4545
"devDependencies": {
46+
"@babel/preset-env": "^7.12.1",
4647
"@fink/cli": "^8.0.0",
4748
"@fink/jest": "^7.0.0",
4849
"@fink/larix": "^15.2.0",
49-
"@fink/loxia": "^18.0.0",
50+
"@fink/loxia": "^19.0.0",
5051
"@fink/require-hook": "^6.0.1",
5152
"commitizen": "^4.0.5",
5253
"cz-conventional-changelog": "^3.1.0",
@@ -60,6 +61,6 @@
6061
}
6162
},
6263
"dependencies": {
63-
"@fink/js-interop": "^2.0.1"
64+
"@fink/js-interop": "^2.2.0"
6465
}
6566
}

src/async.fnk

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
parallel = fn tasks:
99
pipe [...tasks]:
10-
fold item, all=[]:
11-
[...all, await item]
10+
fold await item, all=[]:
11+
[...all, item]
1212

1313

1414

15-
sequential = fold item, all=[]:
16-
[...all, await item]
15+
sequential = fold await item, all=[]:
16+
[...all, item]
1717

1818

1919

src/iter.fnk

Lines changed: 95 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,91 @@
1-
{new} = import '@fink/js-interop/reflect.fnk'
2-
{Symbol, Set} = import '@fink/js-interop/globals.fnk'
1+
# TODO: should all js-interop imports be virtual imports from e.g. @fink/runtime/*
2+
# and have the compiler translate it to the appropriate runtime module
3+
{_iter_, _next_} = import '@fink/js-interop/runtime.js'
4+
{_len_, _is_empty_, _join_, _reverse_, _sort_, _zip_} = import '@fink/js-interop/runtime.js'
35

46
{max_int} = import './num.fnk'
57
{is_fn} = import './fn.fnk'
68

79

810

9-
length = fn iterable:
10-
match iterable:
11-
{length: {}}: iterable.length
12-
{size: {}}: iterable.size
13-
{(Symbol.iterator): {}}: [...iterable].length
14-
else: -1
11+
iter = _iter_
12+
next = _next_
1513

14+
is_empty = _is_empty_
15+
length = _len_
1616

17+
zip = _zip_
18+
reverse = _reverse_
19+
join = _join_
20+
sort = _sort_
1721

18-
is_empty = fn iterable:
19-
match iterable:
20-
{length: {}}: iterable.length == 0
21-
{size: {}}: iterable.size == 0
22-
{(Symbol.iterator): {}}: is_empty [...iterable | take 1]
23-
else: true
2422

2523

24+
drop = fn num_items:
25+
filter , idx=0:
26+
[idx >= num_items, idx + 1]
2627

27-
drop = fn num_items: fn iterable:
28+
29+
30+
drop_last = fn num_items: fn iterable:
2831
pipe iterable:
29-
filter , idx=0:
30-
[idx >= num_items, idx + 1]
32+
map item, buffer=[]:
33+
...match buffer:
34+
num_items > length ?:
35+
[[], [...buffer, item]]
36+
else:
37+
[out, ...rest] = buffer
38+
[[out], [...rest, item]]
3139

3240

3341

3442
take = fn num_items: fn iterable:
3543
match num_items:
36-
0:
37-
[]
44+
0: []
3845
else:
39-
pipe iterable:
40-
until , ctr=1:
41-
[ctr >= num_items, ctr + 1]
46+
iterable | until , ctr=1:
47+
[ctr >= num_items, ctr + 1]
48+
49+
50+
51+
take_last = fn num_items: fn iterable:
52+
last = {}
53+
54+
pipe iterable:
55+
chain [last]
56+
map item, buffer=[]:
57+
...match item:
58+
last:
59+
[buffer, []]
60+
else:
61+
match buffer:
62+
num_items > length ?:
63+
[[], [...buffer, item]]
64+
else:
65+
[, ...rest] = buffer
66+
[[], [...rest, item]]
4267

4368

4469

4570
slice = fn start, end=max_int: fn iterable:
4671
match true:
47-
start + end < 0:
48-
# TODO: use a sliding buffer while iterating over items
49-
[...iterable].slice start, end
72+
end - start == 0:
73+
[]
74+
75+
start < 0 and end < 0:
76+
pipe iterable:
77+
take_last -start
78+
drop_last -end
79+
80+
start < 0:
81+
pipe iterable:
82+
take_last -start
83+
take end + start
84+
85+
end < 0:
86+
pipe iterable:
87+
drop start
88+
drop_last -end
5089

5190
else:
5291
pipe iterable:
@@ -93,72 +132,49 @@ equals = fn it1, it2:
93132

94133

95134

96-
# TODO: should this live in str?
97-
# TODO: should it be fn iterable, sep?
98-
join = fn sep: fn iterable:
99-
[...iterable].join sep
135+
enumerate = fn start=0, step=1:
136+
map item, cntr=start:
137+
[[cntr, item], cntr + step]
100138

101139

102140

103-
enumerate = fn start=0, step=1: fn iterable:
104-
pipe iterable:
105-
map item, cntr=start:
106-
[[cntr, item], cntr + step]
141+
cycle = unfold items:
142+
...items
143+
144+
145+
146+
flatten = map items:
147+
...items
107148

108149

109150

110151
chain = fn ...iterables: fn iterable:
111-
pipe [iterable, ...iterables]:
112-
map iterable:
113-
...iterable
152+
flatten [iterable, ...iterables]
153+
154+
155+
156+
unique = filter item, known=[]:
157+
[not item in known, [...known, item]]
114158

115159

116160

117-
insert_at = fn idx, insert_items: fn iterable:
161+
insert_at = fn idx, items: fn iterable:
118162
ignore = {}
119163

120164
pipe iterable:
121165
chain [ignore]
122166

123167
map item, curr=0:
124168
all = match curr:
125-
idx: insert_items | chain [item]
169+
idx: items | chain [item]
126170
else: [item]
127-
128171
...[all, curr + 1]
129172

130173
filter item:
131174
item != ignore
132175

133176

134177

135-
cycle = fn iterable:
136-
pipe iterable:
137-
unfold items:
138-
...items
139-
140-
141-
142-
flatten = map iterable:
143-
...iterable
144-
145-
146-
147-
reverse = fn iterable:
148-
[...iterable].reverse _
149-
150-
151-
152-
sort = fn compare: fn iterable:
153-
[...iterable].sort compare
154-
155-
156-
157-
unique = fn iterable:
158-
new Set, iterable
159-
160-
161-
162178
find_index = fn item_to_find: fn iterable:
163179
[[, idx]] = pipe iterable:
164180
map item, idx=0:
@@ -175,37 +191,16 @@ find_index = fn item_to_find: fn iterable:
175191

176192

177193

178-
_next_values = fn iters:
179-
pipe iters:
180-
map iter:
181-
{value, done} = iter.next _
182-
... match done:
183-
true: []
184-
else: [value]
194+
item_at = fn idx: fn iterable:
195+
[item] = iterable | filter , curr_idx=0:
196+
[idx == curr_idx, curr_idx + 1]
197+
item
185198

186199

187200

188-
zip = fn ...iterables:
189-
min_len = length iterables
190-
191-
pipe:
192-
unfold _, iters=false:
193-
# JS iterators are stateful, thus we must recreate them
194-
# each time a zip iterable is (re)iterated.
195-
# TODO: it might be good to investigate using a custom iterator
196-
# protocoll that provides a (item, next_fn, descr) tuple
197-
# for each iteration step, allowing us to pass lazy ...rests around
198-
# without making things stateful.
199-
[...its] = match iters:
200-
false: iterables | map iterable:
201-
iterable.(Symbol.iterator) _
202-
else:
203-
iters
204-
205-
[[... _next_values its], its]
206-
207-
while item:
208-
min_len == length item
201+
select = fn indices: fn iterable:
202+
indices | map idx:
203+
iterable | item_at idx
209204

210205

211206

@@ -223,16 +218,12 @@ product = fn ...iterables:
223218
0 == length ?:
224219
iterable | map item: [item]
225220
else:
226-
[...pools] = rest | map items: [...items]
227-
iterable | map item:
228-
... pipe product ...pools:
229-
map items:
230-
[item, ...items]
231-
232-
233-
234-
select = fn indices: fn iterable:
235-
indices | map idx: iterable.(idx)
221+
# [...pools] = rest | map items: [...items]
222+
pipe iterable:
223+
map item:
224+
... pipe product ...rest: #...pools:
225+
map items:
226+
[item, ...items]
236227

237228

238229

@@ -293,11 +284,3 @@ chunks = fn len, fill: fn iterable:
293284
else:
294285
[[], items]
295286

296-
297-
298-
is_iter = fn obj:
299-
match obj:
300-
{(Symbol.iterator): is_fn ?}: true
301-
{(Symbol.asyncIterator): is_fn ?}: true
302-
else: false
303-

0 commit comments

Comments
 (0)