@@ -22,6 +22,10 @@ abstract class Enumerable<T> implements Iterable<T> {
22
22
return new Mapped ( this , selector ) ;
23
23
}
24
24
25
+ groupBy < M > ( selector : Selector < T , M > ) : GroupedEnumerable < T , M > {
26
+ return new GroupedEnumerable < T , M > ( this , selector ) ;
27
+ }
28
+
25
29
where ( filter : Filter < T > ) : Enumerable < T > {
26
30
return new Where ( this , filter ) ;
27
31
}
@@ -63,10 +67,14 @@ abstract class Enumerable<T> implements Iterable<T> {
63
67
return count ;
64
68
}
65
69
66
- sum ( ) {
70
+ sum ( selector ?: Selector < T , number > ) {
67
71
let sum = 0 ;
68
72
for ( let item of this ) {
69
- sum += item as any as number ;
73
+ if ( selector ) {
74
+ sum += selector ( item ) ;
75
+ } else {
76
+ sum += item as any as number ;
77
+ }
70
78
}
71
79
return sum ;
72
80
}
@@ -96,6 +104,54 @@ abstract class Enumerable<T> implements Iterable<T> {
96
104
}
97
105
}
98
106
107
+ class Group < V , K > extends Enumerable < V > {
108
+
109
+ constructor ( public key : K , private buffer : V [ ] ) {
110
+ super ( ) ;
111
+ }
112
+
113
+ * [ Symbol . iterator ] ( ) : IterableIterator < V > {
114
+ for ( let item of this . buffer ) {
115
+ yield item ;
116
+ }
117
+ }
118
+
119
+ }
120
+
121
+ class GroupedEnumerable < V , K > extends Enumerable < Group < V , K > > {
122
+
123
+ constructor ( private list : Enumerable < V > , private selector : Selector < V , K > ) {
124
+ super ( ) ;
125
+ }
126
+
127
+ * [ Symbol . iterator ] ( ) : IterableIterator < Group < V , K > > {
128
+ // we expect list to be ordered - for perfomence reason
129
+ // as this should be as fast as possible
130
+ let last : K = null ;
131
+ let has = false ;
132
+ let buffer : V [ ] = [ ] ;
133
+ for ( let item of this . list ) {
134
+ has = true ;
135
+ if ( last === null ) {
136
+ last = this . selector ( item ) ;
137
+ buffer . push ( item ) ;
138
+ continue ;
139
+ }
140
+ let current = this . selector ( item ) ;
141
+ if ( current != last ) {
142
+ yield new Group < V , K > ( last , buffer ) ;
143
+ buffer = [ item ] ;
144
+ last = current ;
145
+ continue ;
146
+ }
147
+ buffer . push ( item ) ;
148
+ }
149
+ if ( has ) {
150
+ yield new Group < V , K > ( last , buffer ) ;
151
+ }
152
+ }
153
+ }
154
+
99
155
class Except < T > extends Enumerable < T > {
100
156
101
157
constructor ( private list : Iterable < T > , private other : Iterable < T > ) {
0 commit comments