@@ -3,6 +3,25 @@ import {first, labelof, maybeValue, range, valueof} from "./options.js";
33import  { registry }  from  "./scales/index.js" ; 
44import  { maybeReduce }  from  "./transforms/group.js" ; 
55
6+ export  function  channelObject ( channelDescriptors ,  data )  { 
7+   const  channels  =  { } ; 
8+   for  ( const  channel  of  channelDescriptors )  { 
9+     channels [ channel . name ]  =  Channel ( data ,  channel ) ; 
10+   } 
11+   return  channels ; 
12+ } 
13+ 
14+ // TODO use Float64Array.from for position and radius scales? 
15+ export  function  valueObject ( channels ,  scales )  { 
16+   const  values  =  { } ; 
17+   for  ( const  channelName  in  channels )  { 
18+     const  { scale : scaleName ,  value}  =  channels [ channelName ] ; 
19+     const  scale  =  scales [ scaleName ] ; 
20+     values [ channelName ]  =  scale  ===  undefined  ? value  : Array . from ( value ,  scale ) ; 
21+   } 
22+   return  values ; 
23+ } 
24+ 
625// TODO Type coercion? 
726export  function  Channel ( data ,  { scale,  type,  value,  filter,  hint} )  { 
827  return  { 
@@ -15,19 +34,22 @@ export function Channel(data, {scale, type, value, filter, hint}) {
1534  } ; 
1635} 
1736
37+ // Note: mutates channel.domain! This is set to a function so that it is lazily 
38+ // computed; i.e., if the scale’s domain is set explicitly, that takes priority 
39+ // over the sort option, and we don’t need to do additional work. 
1840export  function  channelSort ( channels ,  facetChannels ,  data ,  options )  { 
1941  const  { reverse : defaultReverse ,  reduce : defaultReduce  =  true ,  limit : defaultLimit }  =  options ; 
2042  for  ( const  x  in  options )  { 
2143    if  ( ! registry . has ( x ) )  continue ;  // ignore unknown scale keys 
2244    let  { value : y ,  reverse =  defaultReverse ,  reduce =  defaultReduce ,  limit =  defaultLimit }  =  maybeValue ( options [ x ] ) ; 
2345    if  ( reverse  ===  undefined )  reverse  =  y  ===  "width"  ||  y  ===  "height" ;  // default to descending for lengths 
2446    if  ( reduce  ==  null  ||  reduce  ===  false )  continue ;  // disabled reducer 
25-     const  X  =  channels . find ( ( [ ,   { scale } ] )   =>   scale   ===   x )  ||  facetChannels  &&  facetChannels . find ( ( [ ,   { scale } ] )   =>   scale   ===  x ) ; 
47+     const  X  =  findScaleChannel ( channels ,   x )  ||  facetChannels  &&  findScaleChannel ( facetChannels ,  x ) ; 
2648    if  ( ! X )  throw  new  Error ( `missing channel for scale: ${ x }  ) ; 
27-     const  XV  =  X [ 1 ] . value ; 
49+     const  XV  =  X . value ; 
2850    const  [ lo  =  0 ,  hi  =  Infinity ]  =  limit  &&  typeof  limit [ Symbol . iterator ]  ===  "function"  ? limit  : limit  <  0  ? [ limit ]  : [ 0 ,  limit ] ; 
2951    if  ( y  ==  null )  { 
30-       X [ 1 ] . domain  =  ( )  =>  { 
52+       X . domain  =  ( )  =>  { 
3153        let  domain  =  XV ; 
3254        if  ( reverse )  domain  =  domain . slice ( ) . reverse ( ) ; 
3355        if  ( lo  !==  0  ||  hi  !==  Infinity )  domain  =  domain . slice ( lo ,  hi ) ; 
@@ -39,7 +61,7 @@ export function channelSort(channels, facetChannels, data, options) {
3961          : y  ===  "width"  ? difference ( channels ,  "x1" ,  "x2" ) 
4062          : values ( channels ,  y ,  y  ===  "y"  ? "y2"  : y  ===  "x"  ? "x2"  : undefined ) ; 
4163      const  reducer  =  maybeReduce ( reduce  ===  true  ? "max"  : reduce ,  YV ) ; 
42-       X [ 1 ] . domain  =  ( )  =>  { 
64+       X . domain  =  ( )  =>  { 
4365        let  domain  =  rollup ( range ( XV ) ,  I  =>  reducer . reduce ( I ,  YV ) ,  i  =>  XV [ i ] ) ; 
4466        domain  =  sort ( domain ,  reverse  ? descendingGroup  : ascendingGroup ) ; 
4567        if  ( lo  !==  0  ||  hi  !==  Infinity )  domain  =  domain . slice ( lo ,  hi ) ; 
@@ -49,16 +71,23 @@ export function channelSort(channels, facetChannels, data, options) {
4971  } 
5072} 
5173
74+ function  findScaleChannel ( channels ,  scale )  { 
75+   for  ( const  name  in  channels )  { 
76+     const  channel  =  channels [ name ] ; 
77+     if  ( channel . scale  ===  scale )  return  channel ; 
78+   } 
79+ } 
80+ 
5281function  difference ( channels ,  k1 ,  k2 )  { 
5382  const  X1  =  values ( channels ,  k1 ) ; 
5483  const  X2  =  values ( channels ,  k2 ) ; 
5584  return  Float64Array . from ( X2 ,  ( x2 ,  i )  =>  Math . abs ( x2  -  X1 [ i ] ) ) ; 
5685} 
5786
5887function  values ( channels ,  name ,  alias )  { 
59-   let  channel  =  channels . find ( ( [ n ] )   =>   n   ===   name ) ; 
60-   if  ( ! channel  &&  alias  !==  undefined )  channel  =  channels . find ( ( [ n ] )   =>   n   ===   alias ) ; 
61-   if  ( channel )  return  channel [ 1 ] . value ; 
88+   let  channel  =  channels [ name ] ; 
89+   if  ( ! channel  &&  alias  !==  undefined )  channel  =  channels [ alias ] ; 
90+   if  ( channel )  return  channel . value ; 
6291  throw  new  Error ( `missing channel: ${ name }  ) ; 
6392} 
6493
0 commit comments