Skip to content

Commit

Permalink
refactor: extract zeroOrMinOrMax()
Browse files Browse the repository at this point in the history
  • Loading branch information
kanitw committed May 9, 2024
1 parent 572faa7 commit 6c62d2f
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 56 deletions.
2 changes: 1 addition & 1 deletion src/compile/mark/encode/invalid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {fieldValidPredicate} from '../../../predicate';
import {VgValueRef, isSignalRef} from '../../../vega.schema';
import {getScaleInvalidDataMode} from '../../invalid/ScaleInvalidDataMode';
import {ScaleComponent} from '../../scale/component';
import {zeroOrMinOrMax} from './position-point';
import {zeroOrMinOrMax} from './zeroOrMinOrMax';
import {MidPointParams} from './valueref';

export function getConditionalValueRefForIncludingInvalidValue<
Expand Down
57 changes: 2 additions & 55 deletions src/compile/mark/encode/position-point.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@ import {
getSizeChannel,
getVgPositionChannel,
isXorY,
NonPositionScaleChannel,
PolarPositionChannel,
PolarPositionScaleChannel,
PositionChannel,
PositionScaleChannel
PositionChannel
} from '../../../channel';
import {isFieldDef, isFieldOrDatumDef, TypedFieldDef} from '../../../channeldef';
import {VgValueRef} from '../../../vega.schema';
Expand All @@ -17,6 +14,7 @@ import {ScaleComponent} from '../../scale/component';
import {UnitModel} from '../../unit';
import {positionOffset} from './offset';
import * as ref from './valueref';
import {zeroOrMinOrMax} from './zeroOrMinOrMax';

/**
* Return encode for point (non-band) position channels.
Expand Down Expand Up @@ -160,54 +158,3 @@ export function pointPositionDefaultRef({
return undefined;
};
}

export function zeroOrMinOrMax({
scaleName,
scale,
mode,
mainChannel
}: {
scaleName: string;
scale: ScaleComponent;
mode: 'min' | 'zeroOrMin' | {zeroOrMax: {widthSignal: string; heightSignal: string}};
mainChannel: PositionScaleChannel | PolarPositionScaleChannel | NonPositionScaleChannel;
}): VgValueRef {
if (mode !== 'min' && scaleName && scale.domainDefinitelyIncludesZero()) {
return {
scale: scaleName,
value: 0
};
}

if (mode === 'zeroOrMin' || mode === 'min') {
switch (mainChannel) {
case 'radius':
case 'theta':
case 'x':
return {value: 0};
case 'y':
return {field: {group: 'height'}};
default:
return {signal: `scale('${scaleName}', domain('${scaleName}')[0])`}; // encode the scale domain min
}
} else {
// zeroOrMax
switch (mainChannel) {
case 'radius': {
const {widthSignal, heightSignal} = mode.zeroOrMax;
// max of radius is min(width, height) / 2
return {
signal: `min(${widthSignal},${heightSignal})/2`
};
}
case 'theta':
return {signal: '2*PI'};
case 'x':
return {field: {group: 'width'}};
case 'y':
return {value: 0};
default:
return {signal: `scale('${scaleName}', domain('${scaleName}')[1])`}; // encode the scale domain max
}
}
}
54 changes: 54 additions & 0 deletions src/compile/mark/encode/zeroOrMinOrMax.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import {NonPositionScaleChannel, PolarPositionScaleChannel, PositionScaleChannel} from '../../../channel';
import {VgValueRef} from '../../../vega.schema';
import {ScaleComponent} from '../../scale/component';

export function zeroOrMinOrMax({
scaleName,
scale,
mode,
mainChannel
}: {
scaleName: string;
scale: ScaleComponent;
mode: 'min' | 'zeroOrMin' | {zeroOrMax: {widthSignal: string; heightSignal: string}};
mainChannel: PositionScaleChannel | PolarPositionScaleChannel | NonPositionScaleChannel;
}): VgValueRef {
if (mode !== 'min' && scaleName && scale.domainDefinitelyIncludesZero()) {
return {
scale: scaleName,
value: 0
};
}

if (mode === 'zeroOrMin' || mode === 'min') {
switch (mainChannel) {
case 'radius':
case 'theta':
case 'x':
return {value: 0};
case 'y':
return {field: {group: 'height'}};
default:
return {signal: `scale('${scaleName}', domain('${scaleName}')[0])`}; // encode the scale domain min
}
} else {
// zeroOrMax
switch (mainChannel) {
case 'radius': {
const {widthSignal, heightSignal} = mode.zeroOrMax;
// max of radius is min(width, height) / 2
return {
signal: `min(${widthSignal},${heightSignal})/2`
};
}
case 'theta':
return {signal: '2*PI'};
case 'x':
return {field: {group: 'width'}};
case 'y':
return {value: 0};
default:
return {signal: `scale('${scaleName}', domain('${scaleName}')[1])`}; // encode the scale domain max
}
}
}

0 comments on commit 6c62d2f

Please sign in to comment.