Skip to content

Commit 4865ab6

Browse files
fix group(by) to work with infinite sequences
1 parent 678ad32 commit 4865ab6

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

src/map/group.js

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,48 @@ export function* group ( key , iterable ) {
2525

2626
if ( first.done ) return ;
2727

28-
let item = first.value ;
29-
let nextkey = key( item ) ;
28+
let currval = first.value ;
29+
let currkey = key( currval ) ;
3030

31-
let currkey , buffer ;
31+
let tgtkey ;
3232

33-
grouping : while ( true ) {
34-
35-
currkey = nextkey ;
36-
buffer = [ item ] ;
33+
const grouper = function* ( ) {
3734

3835
while ( true ) {
3936

40-
let current = iterator.next() ;
37+
yield currval ;
4138

42-
if ( current.done ) break grouping ;
39+
let event = iterator.next( ) ;
40+
if ( event.done ) return ;
4341

44-
item = current.value ;
42+
currval = event.value ;
43+
currkey = key( currval ) ;
4544

46-
nextkey = key( item ) ;
45+
if ( currkey !== tgtkey ) return ;
4746

48-
if ( nextkey !== currkey ) {
47+
}
4948

50-
yield [ currkey , buffer ] ;
51-
continue grouping ;
49+
} ;
5250

53-
}
51+
while ( true ) {
5452

55-
buffer.push( item ) ;
53+
tgtkey = currkey ;
5654

57-
}
55+
const g = grouper( ) ;
5856

59-
break grouping ;
57+
yield [ tgtkey , g ] ;
6058

61-
}
59+
while ( currkey === tgtkey ) {
60+
61+
let event = iterator.next( ) ;
62+
if ( event.done ) return ;
6263

63-
yield [ currkey , buffer ] ;
64+
currval = event.value ;
65+
currkey = key( currval ) ;
66+
67+
}
68+
69+
}
6470

6571
}
6672

test/src/map/group.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ test( 'group for infinite sequence of something' , t => {
6060

6161
const v = Math.random( ) ;
6262

63-
[ k , g ] = next( group( identity , repeat( v ) ) ) ;
63+
const [ k , g ] = next( group( identity , repeat( v ) ) ) ;
6464

6565
t.deepEqual( k , v ) ;
6666

0 commit comments

Comments
 (0)