1- import { deviation , max , min , median , mode , variance } from "d3" ;
1+ import { deviation , max , median , min , mode , variance } from "d3" ;
22import { defined } from "../defined.js" ;
3- import { percentile , taker } from "../options.js" ;
3+ import { percentile , subarray , taker } from "../options.js" ;
44import { warn } from "../warnings.js" ;
55import { mapX , mapY } from "./map.js" ;
66
@@ -83,10 +83,6 @@ function maybeReduce(reduce = "mean") {
8383 return reduceArray ( taker ( reduce ) ) ;
8484}
8585
86- function slice ( I , i , j ) {
87- return I . subarray ? I . subarray ( i , j ) : I . slice ( i , j ) ;
88- }
89-
9086// Note that the subarray may include NaN in the non-strict case; we expect the
9187// function f to handle that itself (e.g., by filtering as needed). The D3
9288// reducers (e.g., min, max, mean, median) do, and it’s faster to avoid
@@ -101,7 +97,7 @@ function reduceAccessor(f) {
10197 for ( let i = 0 ; i < k - 1 ; ++ i ) if ( isNaN ( v ( i ) ) ) ++ nans ;
10298 for ( let i = 0 , n = I . length - k + 1 ; i < n ; ++ i ) {
10399 if ( isNaN ( v ( i + k - 1 ) ) ) ++ nans ;
104- T [ I [ i + s ] ] = nans === 0 ? f ( slice ( I , i , i + k ) , v ) : NaN ;
100+ T [ I [ i + s ] ] = nans === 0 ? f ( subarray ( I , i , i + k ) , v ) : NaN ;
105101 if ( isNaN ( v ( i ) ) ) -- nans ;
106102 }
107103 }
@@ -110,10 +106,10 @@ function reduceAccessor(f) {
110106 mapIndex ( I , S , T ) {
111107 const v = ( i ) => ( S [ i ] == null ? NaN : + S [ i ] ) ;
112108 for ( let i = - s ; i < 0 ; ++ i ) {
113- T [ I [ i + s ] ] = f ( slice ( I , 0 , i + k ) , v ) ;
109+ T [ I [ i + s ] ] = f ( subarray ( I , 0 , i + k ) , v ) ;
114110 }
115111 for ( let i = 0 , n = I . length - s ; i < n ; ++ i ) {
116- T [ I [ i + s ] ] = f ( slice ( I , i , i + k ) , v ) ;
112+ T [ I [ i + s ] ] = f ( subarray ( I , i , i + k ) , v ) ;
117113 }
118114 }
119115 } ;
@@ -128,18 +124,18 @@ function reduceArray(f) {
128124 for ( let i = 0 ; i < k - 1 ; ++ i ) count += defined ( S [ I [ i ] ] ) ;
129125 for ( let i = 0 , n = I . length - k + 1 ; i < n ; ++ i ) {
130126 count += defined ( S [ I [ i + k - 1 ] ] ) ;
131- if ( count === k ) T [ I [ i + s ] ] = f ( slice ( I , i , i + k ) , S ) ;
127+ if ( count === k ) T [ I [ i + s ] ] = f ( subarray ( I , i , i + k ) , S ) ;
132128 count -= defined ( S [ I [ i ] ] ) ;
133129 }
134130 }
135131 }
136132 : {
137133 mapIndex ( I , S , T ) {
138134 for ( let i = - s ; i < 0 ; ++ i ) {
139- T [ I [ i + s ] ] = f ( slice ( I , 0 , i + k ) , S ) ;
135+ T [ I [ i + s ] ] = f ( subarray ( I , 0 , i + k ) , S ) ;
140136 }
141137 for ( let i = 0 , n = I . length - s ; i < n ; ++ i ) {
142- T [ I [ i + s ] ] = f ( slice ( I , i , i + k ) , S ) ;
138+ T [ I [ i + s ] ] = f ( subarray ( I , i , i + k ) , S ) ;
143139 }
144140 }
145141 } ;
0 commit comments