1- import { InternSet , rollup , sort } from "d3" ;
1+ import { InternSet , rollups } from "d3" ;
22import { ascendingDefined , descendingDefined } from "./defined.js" ;
33import { first , isColor , isEvery , isIterable , isOpacity , labelof , map , maybeValue , range , valueof } from "./options.js" ;
44import { registry } from "./scales/index.js" ;
@@ -78,11 +78,11 @@ export function inferChannelScale(name, channel) {
7878// computed; i.e., if the scale’s domain is set explicitly, that takes priority
7979// over the sort option, and we don’t need to do additional work.
8080export 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 ;
8282 for ( const x in options ) {
8383 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
8686 if ( reduce == null || reduce === false ) continue ; // disabled reducer
8787 const X = x === "fx" || x === "fy" ? reindexFacetChannel ( facets , facetChannels [ x ] ) : findScaleChannel ( channels , x ) ;
8888 if ( ! X ) throw new Error ( `missing channel for scale: ${ x } ` ) ;
@@ -106,12 +106,13 @@ export function channelDomain(data, facets, channels, facetChannels, options) {
106106 : values ( channels , y , y === "y" ? "y2" : y === "x" ? "x2" : undefined ) ;
107107 const reducer = maybeReduce ( reduce === true ? "max" : reduce , YV ) ;
108108 X . domain = ( ) => {
109- let domain = rollup (
109+ let domain = rollups (
110110 range ( XV ) ,
111111 ( I ) => reducer . reduceIndex ( I , YV ) ,
112112 ( i ) => XV [ i ]
113113 ) ;
114- domain = sort ( domain , reverse ? descendingGroup : ascendingGroup ) ;
114+ if ( order ) domain . sort ( order ) ;
115+ if ( reverse ) domain . reverse ( ) ;
115116 if ( lo !== 0 || hi !== Infinity ) domain = domain . slice ( lo , hi ) ;
116117 return domain . map ( first ) ;
117118 } ;
@@ -154,6 +155,17 @@ function values(channels, name, alias) {
154155 throw new Error ( `missing channel: ${ name } ` ) ;
155156}
156157
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+
157169function ascendingGroup ( [ ak , av ] , [ bk , bv ] ) {
158170 return ascendingDefined ( av , bv ) || ascendingDefined ( ak , bk ) ;
159171}
0 commit comments