@@ -136,13 +136,13 @@ export function maybeReduce(reduce, value) {
136
136
if ( reduce && typeof reduce . reduce === "function" ) return reduce ;
137
137
if ( typeof reduce === "function" ) return reduceFunction ( reduce ) ;
138
138
switch ( ( reduce + "" ) . toLowerCase ( ) ) {
139
- case "first" : return reduceFirst ;
140
- case "last" : return reduceLast ;
141
- case "count" : return reduceCount ;
142
- case "distinct" : return reduceDistinct ;
143
- case "sum" : return value == null ? reduceCount : reduceSum ;
144
- case "proportion" : return reduceProportion ( value , "data" ) ;
145
- case "proportion-facet" : return reduceProportion ( value , "facet" ) ;
139
+ case "first" : return emptyReduce ( reduceFirst ) ;
140
+ case "last" : return emptyReduce ( reduceLast ) ;
141
+ case "count" : return emptyReduce ( reduceCount ) ;
142
+ case "distinct" : return emptyReduce ( reduceDistinct ) ;
143
+ case "sum" : return emptyReduce ( value == null ? reduceCount : reduceSum ) ;
144
+ case "proportion" : return emptyReduce ( reduceProportion ( value , "data" ) ) ;
145
+ case "proportion-facet" : return emptyReduce ( reduceProportion ( value , "facet" ) ) ;
146
146
case "deviation" : return reduceAccessor ( deviation ) ;
147
147
case "min" : return reduceAccessor ( min ) ;
148
148
case "max" : return reduceAccessor ( max ) ;
@@ -154,6 +154,12 @@ export function maybeReduce(reduce, value) {
154
154
throw new Error ( "invalid reduce" ) ;
155
155
}
156
156
157
+ function emptyReduce ( reducer ) {
158
+ const { reduce} = reducer ;
159
+ reducer . reduce = ( I , X , basis ) => I . length ? reduce ( I , X , basis ) : NaN ;
160
+ return reducer ;
161
+ }
162
+
157
163
export function maybeSubgroup ( outputs , Z , F , S ) {
158
164
return firstof (
159
165
outputs . some ( o => o . name === "z" ) ? undefined : Z ,
@@ -199,14 +205,13 @@ const reduceLast = {
199
205
const reduceCount = {
200
206
label : "Frequency" ,
201
207
reduce ( I ) {
202
- return I . length || NaN ;
208
+ return I . length ;
203
209
}
204
210
} ;
205
211
206
212
const reduceDistinct = {
207
213
label : "Distinct" ,
208
214
reduce : ( I , X ) => {
209
- if ( I . length === 0 ) return NaN ;
210
215
const s = new InternSet ( ) ;
211
216
for ( const i of I ) s . add ( X [ i ] ) ;
212
217
return s . size ;
@@ -217,6 +222,6 @@ const reduceSum = reduceAccessor(sum);
217
222
218
223
function reduceProportion ( value , scope ) {
219
224
return value == null
220
- ? { scope, label : "Frequency" , reduce : ( I , V , basis = 1 ) => I . length ? I . length / basis : NaN }
221
- : { scope, reduce : ( I , V , basis = 1 ) => I . length ? sum ( I , i => V [ i ] ) / basis : NaN } ;
225
+ ? { scope, label : "Frequency" , reduce : ( I , V , basis = 1 ) => I . length / basis }
226
+ : { scope, reduce : ( I , V , basis = 1 ) => sum ( I , i => V [ i ] ) / basis } ;
222
227
}
0 commit comments