11import { mapX , mapY } from './map.js' ;
2- import type { TransformArg , RawValue , MapIndexObject } from '$lib/types/index.js' ;
2+ import type { TransformArg , RawValue , MapIndexObject , MapIndexFunction } from '$lib/types/index.js' ;
33import { min , max , mean , median , sum , deviation , extent } from 'd3-array' ;
44import { sort } from './sort.js' ;
55
6+ type BasisFunction = ( I : number [ ] , S : RawValue [ ] ) => number ;
7+
68type NormalizeBasis =
79 | 'deviation'
810 | 'first'
@@ -13,23 +15,33 @@ type NormalizeBasis =
1315 | 'median'
1416 | 'sum'
1517 | 'extent'
18+ | BasisFunction
1619 | MapIndexObject ;
1720
21+ type NormalizeOptions = NormalizeBasis | { basis : NormalizeBasis } ;
22+
1823/**
1924 * Normalizes the x values based on the specified basis. Uses mapX.
2025 */
21- export function normalizeX < T > ( args : TransformArg < T > , basis : NormalizeBasis ) {
22- return mapX ( args , normalize ( basis ) ) ;
26+ export function normalizeX < T > ( args : TransformArg < T > , options : NormalizeOptions ) {
27+ return mapX ( args , normalize ( options ) ) ;
2328}
2429
2530/**
2631 * Normalizes the y values based on the specified basis. Uses mapY.
2732 */
28- export function normalizeY < T > ( args : TransformArg < T > , basis : NormalizeBasis ) {
29- return mapY ( args , normalize ( basis ) ) ;
33+ export function normalizeY < T > ( args : TransformArg < T > , options : NormalizeOptions ) {
34+ return mapY ( args , normalize ( options ) ) ;
3035}
3136
32- function normalize ( basis : NormalizeBasis ) : MapIndexObject {
37+ function isMapIndex ( obj : any ) : obj is MapIndexObject {
38+ return obj && typeof obj . mapIndex === 'function' ;
39+ }
40+
41+ function normalize ( options : NormalizeOptions ) : MapIndexObject {
42+ if ( isMapIndex ( options ) ) return options ;
43+ if ( typeof options === 'object' && isMapIndex ( options ?. basis ) ) return options ?. basis ;
44+ const basis = typeof options === 'object' ? options . basis : options ;
3345 if ( basis === undefined ) return normalizeFirst ;
3446 if ( typeof basis === 'function' ) return normalizeBasis ( basis ) ;
3547 // if (/^p\d{2}$/i.test(basis)) return normalizeAccessor(percentile(basis));
@@ -56,7 +68,7 @@ function normalize(basis: NormalizeBasis): MapIndexObject {
5668 throw new Error ( `invalid basis: ${ basis } ` ) ;
5769}
5870
59- function normalizeBasis ( basis : ( I : number [ ] , S : RawValue [ ] ) => number ) : MapIndexObject {
71+ function normalizeBasis ( basis : BasisFunction ) : MapIndexObject {
6072 return {
6173 mapIndex ( I , S , T ) {
6274 const b = + basis ( I , S ) ;
@@ -96,7 +108,7 @@ const normalizeLast = normalizeBasis((I, S) => {
96108} ) ;
97109
98110const normalizeDeviation = {
99- mapIndex ( I , S , T ) {
111+ mapIndex ( I : number [ ] , S : RawValue [ ] , T : number [ ] ) {
100112 const m = mean ( I , ( i ) => S [ i ] ) ;
101113 const d = deviation ( I , ( i ) => S [ i ] ) ;
102114 for ( const i of I ) {
0 commit comments