1
- import { InternSet , rollup , sort } from "d3" ;
1
+ import { InternSet , rollups } from "d3" ;
2
2
import { ascendingDefined , descendingDefined } from "./defined.js" ;
3
3
import { first , isColor , isEvery , isIterable , isOpacity , labelof , map , maybeValue , range , valueof } from "./options.js" ;
4
4
import { registry } from "./scales/index.js" ;
@@ -78,11 +78,11 @@ export function inferChannelScale(name, channel) {
78
78
// computed; i.e., if the scale’s domain is set explicitly, that takes priority
79
79
// over the sort option, and we don’t need to do additional work.
80
80
export function channelDomain ( data , facets , channels , facetChannels , options ) {
81
- const { reverse : defaultReverse , reduce : defaultReduce = true , limit : defaultLimit } = options ;
81
+ const { order : defaultOrder , reverse : defaultReverse , reduce : defaultReduce = true , limit : defaultLimit } = options ;
82
82
for ( const x in options ) {
83
83
if ( ! registry . has ( x ) ) continue ; // ignore unknown scale keys (including generic options)
84
- let { value : y , reverse = defaultReverse , reduce = defaultReduce , limit = defaultLimit } = maybeValue ( options [ x ] ) ;
85
- if ( reverse === undefined ) reverse = y === "width" || y === "height" ; // default to descending for lengths
84
+ let { value : y , order = defaultOrder , reverse = defaultReverse , reduce = defaultReduce , limit = defaultLimit } = maybeValue ( options [ x ] ) ; // prettier-ignore
85
+ order = order === undefined ? y === "width" || y === "height" ? descendingGroup : ascendingGroup : maybeOrder ( order ) ; // prettier-ignore
86
86
if ( reduce == null || reduce === false ) continue ; // disabled reducer
87
87
const X = x === "fx" || x === "fy" ? reindexFacetChannel ( facets , facetChannels [ x ] ) : findScaleChannel ( channels , x ) ;
88
88
if ( ! X ) throw new Error ( `missing channel for scale: ${ x } ` ) ;
@@ -106,12 +106,13 @@ export function channelDomain(data, facets, channels, facetChannels, options) {
106
106
: values ( channels , y , y === "y" ? "y2" : y === "x" ? "x2" : undefined ) ;
107
107
const reducer = maybeReduce ( reduce === true ? "max" : reduce , YV ) ;
108
108
X . domain = ( ) => {
109
- let domain = rollup (
109
+ let domain = rollups (
110
110
range ( XV ) ,
111
111
( I ) => reducer . reduceIndex ( I , YV ) ,
112
112
( i ) => XV [ i ]
113
113
) ;
114
- domain = sort ( domain , reverse ? descendingGroup : ascendingGroup ) ;
114
+ if ( order ) domain . sort ( order ) ;
115
+ if ( reverse ) domain . reverse ( ) ;
115
116
if ( lo !== 0 || hi !== Infinity ) domain = domain . slice ( lo , hi ) ;
116
117
return domain . map ( first ) ;
117
118
} ;
@@ -154,6 +155,17 @@ function values(channels, name, alias) {
154
155
throw new Error ( `missing channel: ${ name } ` ) ;
155
156
}
156
157
158
+ function maybeOrder ( order ) {
159
+ if ( order == null || typeof order === "function" ) return order ;
160
+ switch ( `${ order } ` . toLowerCase ( ) ) {
161
+ case "ascending" :
162
+ return ascendingGroup ;
163
+ case "descending" :
164
+ return descendingGroup ;
165
+ }
166
+ throw new Error ( `invalid order: ${ order } ` ) ;
167
+ }
168
+
157
169
function ascendingGroup ( [ ak , av ] , [ bk , bv ] ) {
158
170
return ascendingDefined ( av , bv ) || ascendingDefined ( ak , bk ) ;
159
171
}
0 commit comments