@genome-spy/core 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/dist/index.js +224 -0
  2. package/dist/style.css +1 -0
  3. package/package.json +54 -0
  4. package/src/data/collector.js +178 -0
  5. package/src/data/collector.test.js +82 -0
  6. package/src/data/dataFlow.js +109 -0
  7. package/src/data/dataFlow.test.js +3 -0
  8. package/src/data/facetNode.js +17 -0
  9. package/src/data/flow.test.js +71 -0
  10. package/src/data/flowBatch.d.ts +40 -0
  11. package/src/data/flowNode.js +283 -0
  12. package/src/data/flowNode.test.js +49 -0
  13. package/src/data/flowOptimizer.js +117 -0
  14. package/src/data/flowOptimizer.test.js +192 -0
  15. package/src/data/flowTestUtils.js +63 -0
  16. package/src/data/formats/fasta.js +32 -0
  17. package/src/data/formats/fasta.test.js +26 -0
  18. package/src/data/sources/dataSource.js +22 -0
  19. package/src/data/sources/dataSourceFactory.js +24 -0
  20. package/src/data/sources/dataUtils.js +31 -0
  21. package/src/data/sources/dynamicCallbackSource.js +56 -0
  22. package/src/data/sources/dynamicSource.js +36 -0
  23. package/src/data/sources/inlineSource.js +69 -0
  24. package/src/data/sources/inlineSource.test.js +55 -0
  25. package/src/data/sources/namedSource.js +74 -0
  26. package/src/data/sources/sequenceSource.js +46 -0
  27. package/src/data/sources/sequenceSource.test.js +45 -0
  28. package/src/data/sources/urlSource.js +74 -0
  29. package/src/data/transforms/aggregate.js +69 -0
  30. package/src/data/transforms/clone.js +40 -0
  31. package/src/data/transforms/clone.test.js +10 -0
  32. package/src/data/transforms/coverage.js +187 -0
  33. package/src/data/transforms/coverage.test.js +122 -0
  34. package/src/data/transforms/filter.js +37 -0
  35. package/src/data/transforms/filter.test.js +17 -0
  36. package/src/data/transforms/filterScoredLabels.js +134 -0
  37. package/src/data/transforms/flattenCompressedExons.js +57 -0
  38. package/src/data/transforms/flattenDelimited.js +68 -0
  39. package/src/data/transforms/flattenDelimited.test.js +86 -0
  40. package/src/data/transforms/flattenSequence.js +39 -0
  41. package/src/data/transforms/flattenSequence.test.js +33 -0
  42. package/src/data/transforms/formula.js +39 -0
  43. package/src/data/transforms/formula.test.js +18 -0
  44. package/src/data/transforms/identifier.js +108 -0
  45. package/src/data/transforms/identifier.test.js +82 -0
  46. package/src/data/transforms/linearizeGenomicCoordinate.js +101 -0
  47. package/src/data/transforms/measureText.js +44 -0
  48. package/src/data/transforms/pileup.js +128 -0
  49. package/src/data/transforms/pileup.test.js +69 -0
  50. package/src/data/transforms/project.js +41 -0
  51. package/src/data/transforms/project.test.js +31 -0
  52. package/src/data/transforms/regexExtract.js +61 -0
  53. package/src/data/transforms/regexExtract.test.js +66 -0
  54. package/src/data/transforms/regexFold.js +141 -0
  55. package/src/data/transforms/regexFold.test.js +159 -0
  56. package/src/data/transforms/sample.js +101 -0
  57. package/src/data/transforms/sample.test.js +37 -0
  58. package/src/data/transforms/stack.js +137 -0
  59. package/src/data/transforms/stack.test.js +90 -0
  60. package/src/data/transforms/transformFactory.js +60 -0
  61. package/src/encoder/accessor.js +82 -0
  62. package/src/encoder/accessor.test.js +46 -0
  63. package/src/encoder/encoder.js +369 -0
  64. package/src/encoder/encoder.test.js +97 -0
  65. package/src/fonts/Lato-Regular.json +1267 -0
  66. package/src/fonts/Lato-Regular.png +0 -0
  67. package/src/fonts/OFL.txt +93 -0
  68. package/src/fonts/README.md +3 -0
  69. package/src/fonts/bmFont.d.ts +58 -0
  70. package/src/fonts/bmFontManager.js +357 -0
  71. package/src/fonts/bmFontMetrics.js +108 -0
  72. package/src/genome/genome.js +305 -0
  73. package/src/genome/genome.test.js +152 -0
  74. package/src/genome/genomeStore.js +54 -0
  75. package/src/genome/locusFormat.js +31 -0
  76. package/src/genome/scaleIndex.js +199 -0
  77. package/src/genome/scaleIndex.test.js +61 -0
  78. package/src/genome/scaleLocus.js +112 -0
  79. package/src/genome/scaleLocus.test.js +3 -0
  80. package/src/genomeSpy.js +753 -0
  81. package/src/gl/arrayBuilder.js +199 -0
  82. package/src/gl/dataToVertices.js +621 -0
  83. package/src/gl/includes/common.glsl +63 -0
  84. package/src/gl/includes/fp64-arithmetic.glsl +187 -0
  85. package/src/gl/includes/fp64-utils.js +132 -0
  86. package/src/gl/includes/picking.fragment.glsl +3 -0
  87. package/src/gl/includes/picking.vertex.glsl +29 -0
  88. package/src/gl/includes/sampleFacet.glsl +107 -0
  89. package/src/gl/includes/scales.glsl +79 -0
  90. package/src/gl/includes/scales_fp64.glsl +30 -0
  91. package/src/gl/link.fragment.glsl +18 -0
  92. package/src/gl/link.vertex.glsl +111 -0
  93. package/src/gl/point.fragment.glsl +123 -0
  94. package/src/gl/point.vertex.glsl +128 -0
  95. package/src/gl/rect.fragment.glsl +51 -0
  96. package/src/gl/rect.vertex.glsl +114 -0
  97. package/src/gl/rule.fragment.glsl +52 -0
  98. package/src/gl/rule.vertex.glsl +89 -0
  99. package/src/gl/text.fragment.glsl +31 -0
  100. package/src/gl/text.vertex.glsl +246 -0
  101. package/src/gl/webGLHelper.js +490 -0
  102. package/src/img/bowtie.svg +1 -0
  103. package/src/img/genomespy-favicon.svg +34 -0
  104. package/src/index.html +11 -0
  105. package/src/index.js +151 -0
  106. package/src/marks/link.js +189 -0
  107. package/src/marks/mark.js +867 -0
  108. package/src/marks/markUtils.js +109 -0
  109. package/src/marks/pointMark.js +279 -0
  110. package/src/marks/rectMark.js +236 -0
  111. package/src/marks/rule.js +231 -0
  112. package/src/marks/text.js +274 -0
  113. package/src/options.d.ts +9 -0
  114. package/src/scale/colorUtils.js +184 -0
  115. package/src/scale/glslScaleGenerator.js +462 -0
  116. package/src/scale/scale.js +441 -0
  117. package/src/scale/scale.test.js +323 -0
  118. package/src/scale/ticks.js +198 -0
  119. package/src/scale/ticks.test.js +39 -0
  120. package/src/singlePageApp.js +13 -0
  121. package/src/spec/axis.d.ts +296 -0
  122. package/src/spec/channel.d.ts +127 -0
  123. package/src/spec/data.d.ts +185 -0
  124. package/src/spec/font.d.ts +15 -0
  125. package/src/spec/genome.d.ts +35 -0
  126. package/src/spec/mark.d.ts +432 -0
  127. package/src/spec/root.d.ts +22 -0
  128. package/src/spec/scale.d.ts +265 -0
  129. package/src/spec/tooltip.d.ts +9 -0
  130. package/src/spec/transform.d.ts +479 -0
  131. package/src/spec/view.d.ts +215 -0
  132. package/src/styles/genome-spy.scss +153 -0
  133. package/src/tooltip/dataTooltipHandler.js +59 -0
  134. package/src/tooltip/refseqGeneTooltipHandler.js +77 -0
  135. package/src/tooltip/tooltipHandler.ts +12 -0
  136. package/src/types/filetypes.d.ts +4 -0
  137. package/src/types/flatqueue.d.ts +53 -0
  138. package/src/types/glsl.d.ts +4 -0
  139. package/src/types/object.d.ts +21 -0
  140. package/src/types/vega-scale.d.ts +60 -0
  141. package/src/utils/animator.js +83 -0
  142. package/src/utils/arrayUtils.js +55 -0
  143. package/src/utils/binnedRangeIndex.js +83 -0
  144. package/src/utils/clamp.js +8 -0
  145. package/src/utils/cloner.js +32 -0
  146. package/src/utils/cloner.test.js +23 -0
  147. package/src/utils/coalesce.js +11 -0
  148. package/src/utils/coalesce.test.js +15 -0
  149. package/src/utils/concatIterables.js +26 -0
  150. package/src/utils/concatIterables.test.js +7 -0
  151. package/src/utils/debounce.js +37 -0
  152. package/src/utils/domainArray.js +224 -0
  153. package/src/utils/domainArray.test.js +129 -0
  154. package/src/utils/eerp.js +13 -0
  155. package/src/utils/expression.js +32 -0
  156. package/src/utils/field.js +28 -0
  157. package/src/utils/fisheye.js +60 -0
  158. package/src/utils/formatObject.js +31 -0
  159. package/src/utils/html.js +23 -0
  160. package/src/utils/html.test.js +13 -0
  161. package/src/utils/indexer.js +43 -0
  162. package/src/utils/indexer.test.js +46 -0
  163. package/src/utils/inertia.js +124 -0
  164. package/src/utils/interactionEvent.js +33 -0
  165. package/src/utils/iterateNestedMaps.js +21 -0
  166. package/src/utils/iterateNestedMaps.test.js +32 -0
  167. package/src/utils/kWayMerge.js +42 -0
  168. package/src/utils/kWayMerge.test.js +25 -0
  169. package/src/utils/layout/flexLayout.js +336 -0
  170. package/src/utils/layout/flexLayout.test.js +296 -0
  171. package/src/utils/layout/padding.js +107 -0
  172. package/src/utils/layout/point.js +23 -0
  173. package/src/utils/layout/rectangle.js +282 -0
  174. package/src/utils/layout/rectangle.test.js +171 -0
  175. package/src/utils/mergeObjects.js +99 -0
  176. package/src/utils/mergeObjects.test.js +41 -0
  177. package/src/utils/numberExtractor.js +24 -0
  178. package/src/utils/numberExtractor.test.js +5 -0
  179. package/src/utils/point.js +14 -0
  180. package/src/utils/propertyCacher.js +70 -0
  181. package/src/utils/propertyCacher.test.js +84 -0
  182. package/src/utils/propertyCoalescer.js +37 -0
  183. package/src/utils/propertyCoalescer.test.js +21 -0
  184. package/src/utils/reservationMap.js +103 -0
  185. package/src/utils/reservationMap.test.js +19 -0
  186. package/src/utils/scaleNull.js +19 -0
  187. package/src/utils/setOperations.js +75 -0
  188. package/src/utils/smoothstep.js +10 -0
  189. package/src/utils/throttle.js +34 -0
  190. package/src/utils/topK.js +76 -0
  191. package/src/utils/topK.test.js +63 -0
  192. package/src/utils/transition.js +74 -0
  193. package/src/utils/ui/tooltip.js +189 -0
  194. package/src/utils/url.js +22 -0
  195. package/src/utils/variableTools.js +24 -0
  196. package/src/utils/variableTools.test.js +12 -0
  197. package/src/view/axisResolution.js +135 -0
  198. package/src/view/axisResolution.test.js +200 -0
  199. package/src/view/axisView.js +746 -0
  200. package/src/view/channel.js +5 -0
  201. package/src/view/concatView.js +296 -0
  202. package/src/view/containerView.js +141 -0
  203. package/src/view/decoratorView.js +510 -0
  204. package/src/view/facetView.js +488 -0
  205. package/src/view/flowBuilder.js +362 -0
  206. package/src/view/flowBuilder.test.js +124 -0
  207. package/src/view/importView.js +19 -0
  208. package/src/view/layerView.js +60 -0
  209. package/src/view/rendering.d.ts +44 -0
  210. package/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
  211. package/src/view/renderingContext/deferredViewRenderingContext.js +174 -0
  212. package/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
  213. package/src/view/renderingContext/simpleViewRenderingContext.js +62 -0
  214. package/src/view/renderingContext/svgViewRenderingContext.js +121 -0
  215. package/src/view/renderingContext/viewRenderingContext.js +41 -0
  216. package/src/view/scaleResolution.js +756 -0
  217. package/src/view/scaleResolution.test.js +571 -0
  218. package/src/view/scaleResolutionApi.d.ts +40 -0
  219. package/src/view/testUtils.js +48 -0
  220. package/src/view/unitView.js +368 -0
  221. package/src/view/view.js +589 -0
  222. package/src/view/view.test.js +213 -0
  223. package/src/view/viewContext.d.ts +57 -0
  224. package/src/view/viewFactory.js +179 -0
  225. package/src/view/viewFactory.test.js +16 -0
  226. package/src/view/viewUtils.js +420 -0
@@ -0,0 +1,441 @@
1
+ /*!
2
+ * Adapted from vega-encode:
3
+ * https://github.com/vega/vega/blob/master/packages/vega-encode/src/Scale.js
4
+ *
5
+ * Copyright (c) 2015-2018, University of Washington Interactive Data Lab
6
+ * All rights reserved.
7
+ *
8
+ * BSD-3-Clause License: https://github.com/vega/vega-lite/blob/master/LICENSE
9
+ */
10
+
11
+ /* eslint-disable */
12
+
13
+ import { tickCount } from "./ticks";
14
+ import {
15
+ error,
16
+ inherits,
17
+ isArray,
18
+ isFunction,
19
+ isString,
20
+ peek,
21
+ stringValue,
22
+ toSet,
23
+ zoomLinear,
24
+ zoomLog,
25
+ zoomPow,
26
+ zoomSymlog,
27
+ } from "vega-util";
28
+
29
+ import {
30
+ Ordinal,
31
+ Band,
32
+ Point,
33
+ Sequential,
34
+ Diverging,
35
+ Linear,
36
+ Log,
37
+ Pow,
38
+ Sqrt,
39
+ Symlog,
40
+ Time,
41
+ UTC,
42
+ Quantile,
43
+ Quantize,
44
+ Threshold,
45
+ BinOrdinal,
46
+ isContinuous,
47
+ isInterpolating,
48
+ isLogarithmic,
49
+ bandSpace,
50
+ interpolateColors,
51
+ interpolateRange,
52
+ interpolate as getInterpolate,
53
+ scale as getScale,
54
+ scheme as getScheme,
55
+ scaleImplicit,
56
+ quantizeInterpolator,
57
+ } from "vega-scale";
58
+
59
+ import { range as sequence } from "d3-array";
60
+
61
+ import { interpolate, interpolateRound } from "d3-interpolate";
62
+
63
+ const Locus = "locus";
64
+ const Index = "index";
65
+
66
+ var DEFAULT_COUNT = 5;
67
+
68
+ function includeZero(scale) {
69
+ const type = scale.type;
70
+ return !scale.bins && (type === Linear || type === Pow || type === Sqrt);
71
+ }
72
+
73
+ function includePad(type) {
74
+ return isContinuous(type) && ![Sequential, Index, Locus].includes(type);
75
+ }
76
+
77
+ function ensureLogger(logger) {
78
+ return (
79
+ logger || {
80
+ warn: (msg, ...rest) => console.warn(msg, ...rest),
81
+ }
82
+ );
83
+ }
84
+
85
+ var SKIP = toSet([
86
+ "set",
87
+ "modified",
88
+ "clear",
89
+ "type",
90
+ "scheme",
91
+ "schemeExtent",
92
+ "schemeCount",
93
+ "domain",
94
+ "domainMin",
95
+ "domainMid",
96
+ "domainMax",
97
+ "domainRaw",
98
+ "domainImplicit",
99
+ "nice",
100
+ "zero",
101
+ "bins",
102
+ "range",
103
+ "rangeStep",
104
+ "round",
105
+ "reverse",
106
+ "interpolate",
107
+ "interpolateGamma",
108
+ "zoom",
109
+ "fp64",
110
+ "name",
111
+ ]);
112
+
113
+ export function configureScale(_, scale, logger) {
114
+ logger = ensureLogger(logger);
115
+
116
+ for (const key in _) {
117
+ if (!SKIP[key]) {
118
+ // padding is a scale property for band/point but not others
119
+ if (key === "padding" && includePad(scale.type)) continue;
120
+ // invoke scale property setter, raise warning if not found
121
+ isFunction(scale[key])
122
+ ? scale[key](_[key])
123
+ : logger.warn("Unsupported scale property: " + key);
124
+ }
125
+ }
126
+
127
+ configureRange(
128
+ scale,
129
+ _,
130
+ configureBins(scale, _, configureDomain(scale, _, logger))
131
+ );
132
+ }
133
+
134
+ export default function createScale(_, logger) {
135
+ const key = scaleKey(_);
136
+ const scale = getScale(key);
137
+
138
+ if (!scale) {
139
+ throw new Error("Unknown scale type: " + key);
140
+ }
141
+
142
+ const scaleInstance = scale();
143
+
144
+ configureScale(_, scaleInstance, logger);
145
+
146
+ return scaleInstance;
147
+ }
148
+
149
+ function scaleKey(_) {
150
+ var t = _.type,
151
+ d = "",
152
+ n;
153
+
154
+ // backwards compatibility pre Vega 5.
155
+ if (t === Sequential) return Sequential + "-" + Linear;
156
+
157
+ if (isContinuousColor(_)) {
158
+ n = _.rawDomain
159
+ ? _.rawDomain.length
160
+ : _.domain
161
+ ? _.domain.length + +(_.domainMid != null)
162
+ : 0;
163
+ d = n === 2 ? Sequential + "-" : n === 3 ? Diverging + "-" : "";
164
+ }
165
+
166
+ return (d + t || Linear).toLowerCase();
167
+ }
168
+
169
+ function isContinuousColor(_) {
170
+ const t = _.type;
171
+ return (
172
+ isContinuous(t) &&
173
+ t !== Time &&
174
+ t !== UTC &&
175
+ (_.scheme || (_.range && _.range.length && _.range.every(isString)))
176
+ );
177
+ }
178
+
179
+ export function configureDomain(scale, _, logger) {
180
+ if (!scale.domain) {
181
+ return 0;
182
+ }
183
+
184
+ logger = ensureLogger(logger);
185
+
186
+ // check raw domain, if provided use that and exit early
187
+ var raw = rawDomain(scale, _.domainRaw, logger);
188
+ if (raw > -1) return raw;
189
+
190
+ var domain = _.domain,
191
+ type = scale.type,
192
+ zero = _.zero || (_.zero === undefined && includeZero(scale)),
193
+ n,
194
+ mid;
195
+
196
+ if (!domain) return 0;
197
+
198
+ // adjust continuous domain for minimum pixel padding
199
+ if (includePad(type) && _.padding && domain[0] !== peek(domain)) {
200
+ domain = padDomain(
201
+ type,
202
+ domain,
203
+ _.range,
204
+ _.padding,
205
+ _.exponent,
206
+ _.constant
207
+ );
208
+ }
209
+
210
+ // adjust domain based on zero, min, max settings
211
+ if (
212
+ zero ||
213
+ _.domainMin != null ||
214
+ _.domainMax != null ||
215
+ _.domainMid != null
216
+ ) {
217
+ n = (domain = domain.slice()).length - 1 || 1;
218
+ if (zero) {
219
+ if (domain[0] > 0) domain[0] = 0;
220
+ if (domain[n] < 0) domain[n] = 0;
221
+ }
222
+ if (_.domainMin != null) domain[0] = _.domainMin;
223
+ if (_.domainMax != null) domain[n] = _.domainMax;
224
+
225
+ if (_.domainMid != null) {
226
+ mid = _.domainMid;
227
+ if (mid < domain[0] || mid > domain[n]) {
228
+ logger.warn("Scale domainMid exceeds domain min or max.", mid);
229
+ }
230
+ domain.splice(n, 0, mid);
231
+ }
232
+ }
233
+
234
+ // set the scale domain
235
+ scale.domain(domainCheck(type, domain, logger));
236
+
237
+ // if ordinal scale domain is defined, prevent implicit
238
+ // domain construction as side-effect of scale lookup
239
+ if (type === Ordinal) {
240
+ scale.unknown(_.domainImplicit ? scaleImplicit : undefined);
241
+ }
242
+
243
+ // perform 'nice' adjustment as requested
244
+ if (_.nice && scale.nice) {
245
+ scale.nice((_.nice !== true && tickCount(scale, _.nice)) || null);
246
+ }
247
+
248
+ // return the cardinality of the domain
249
+ return domain.length;
250
+ }
251
+
252
+ function rawDomain(scale, raw, logger) {
253
+ if (raw) {
254
+ scale.domain(domainCheck(scale.type, raw, logger));
255
+ return raw.length;
256
+ } else {
257
+ return -1;
258
+ }
259
+ }
260
+
261
+ function padDomain(type, domain, range, pad, exponent, constant) {
262
+ var span = Math.abs(peek(range) - range[0]),
263
+ frac = span / (span - 2 * pad),
264
+ d =
265
+ type === Log
266
+ ? zoomLog(domain, null, frac)
267
+ : type === Sqrt
268
+ ? zoomPow(domain, null, frac, 0.5)
269
+ : type === Pow
270
+ ? zoomPow(domain, null, frac, exponent || 1)
271
+ : type === Symlog
272
+ ? zoomSymlog(domain, null, frac, constant || 1)
273
+ : zoomLinear(domain, null, frac);
274
+
275
+ domain = domain.slice();
276
+ domain[0] = d[0];
277
+ domain[domain.length - 1] = d[1];
278
+ return domain;
279
+ }
280
+
281
+ function domainCheck(type, domain, logger) {
282
+ if (isLogarithmic(type)) {
283
+ // sum signs of domain values
284
+ // if all pos or all neg, abs(sum) === domain.length
285
+ var s = Math.abs(
286
+ domain.reduce(function (s, v) {
287
+ return s + (v < 0 ? -1 : v > 0 ? 1 : 0);
288
+ }, 0)
289
+ );
290
+
291
+ if (s !== domain.length) {
292
+ logger.warn(
293
+ "Log scale domain includes zero: " + stringValue(domain)
294
+ );
295
+ }
296
+ }
297
+ return domain;
298
+ }
299
+
300
+ function configureBins(scale, _, count) {
301
+ let bins = _.bins;
302
+
303
+ if (bins && !isArray(bins)) {
304
+ // generate bin boundary array
305
+ const domain =
306
+ (bins.start == null || bins.stop == null) && scale.domain(),
307
+ start = bins.start == null ? domain[0] : bins.start,
308
+ stop = bins.stop == null ? peek(domain) : bins.stop,
309
+ step = bins.step;
310
+
311
+ if (!step) error("Scale bins parameter missing step property.");
312
+ bins = sequence(start, stop + step, step);
313
+ }
314
+
315
+ if (bins) {
316
+ // assign bin boundaries to scale instance
317
+ scale.bins = bins;
318
+ } else if (scale.bins) {
319
+ // no current bins, remove bins if previously set
320
+ delete scale.bins;
321
+ }
322
+
323
+ // special handling for bin-ordinal scales
324
+ if (scale.type === BinOrdinal) {
325
+ if (!bins) {
326
+ // the domain specifies the bins
327
+ scale.bins = scale.domain();
328
+ } else if (!_.domain && !_.domainRaw) {
329
+ // the bins specify the domain
330
+ scale.domain(bins);
331
+ count = bins.length;
332
+ }
333
+ }
334
+
335
+ // return domain cardinality
336
+ return count;
337
+ }
338
+
339
+ function configureRange(scale, _, count) {
340
+ var type = scale.type,
341
+ round = _.round || false,
342
+ range = _.range;
343
+
344
+ // if range step specified, calculate full range extent
345
+ if (_.rangeStep != null) {
346
+ range = configureRangeStep(type, _, count);
347
+ }
348
+
349
+ // else if a range scheme is defined, use that
350
+ else if (_.scheme) {
351
+ range = configureScheme(type, _, count);
352
+ if (isFunction(range)) {
353
+ if (scale.interpolator) {
354
+ return scale.interpolator(range);
355
+ } else {
356
+ error(
357
+ `Scale type ${type} does not support interpolating color schemes.`
358
+ );
359
+ }
360
+ }
361
+ }
362
+
363
+ // given a range array for an interpolating scale, convert to interpolator
364
+ if (range && isInterpolating(type)) {
365
+ return scale.interpolator(
366
+ interpolateColors(
367
+ flip(range, _.reverse),
368
+ _.interpolate,
369
+ _.interpolateGamma
370
+ )
371
+ );
372
+ }
373
+
374
+ // configure rounding / interpolation
375
+ if (range && _.interpolate && scale.interpolate) {
376
+ scale.interpolate(getInterpolate(_.interpolate, _.interpolateGamma));
377
+ } else if (isFunction(scale.round)) {
378
+ scale.round(round);
379
+ } else if (isFunction(scale.rangeRound)) {
380
+ scale.interpolate(round ? interpolateRound : interpolate);
381
+ }
382
+
383
+ if (range) scale.range(flip(range, _.reverse));
384
+ }
385
+
386
+ function configureRangeStep(type, _, count) {
387
+ if (type !== Band && type !== Point) {
388
+ error("Only band and point scales support rangeStep.");
389
+ }
390
+
391
+ // calculate full range based on requested step size and padding
392
+ var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0,
393
+ inner =
394
+ type === Point
395
+ ? 1
396
+ : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;
397
+ return [0, _.rangeStep * bandSpace(count, inner, outer)];
398
+ }
399
+
400
+ function configureScheme(type, _, count) {
401
+ var extent = _.schemeExtent,
402
+ name,
403
+ scheme;
404
+
405
+ if (isArray(_.scheme)) {
406
+ scheme = interpolateColors(_.scheme, _.interpolate, _.interpolateGamma);
407
+ } else {
408
+ name = _.scheme.toLowerCase();
409
+ scheme = getScheme(name);
410
+ if (!scheme) error(`Unrecognized scheme name: ${_.scheme}`);
411
+ }
412
+
413
+ // determine size for potential discrete range
414
+ count =
415
+ type === Threshold
416
+ ? count + 1
417
+ : type === BinOrdinal
418
+ ? count - 1
419
+ : type === Quantile || type === Quantize
420
+ ? +_.schemeCount || DEFAULT_COUNT
421
+ : count;
422
+
423
+ // adjust and/or quantize scheme as appropriate
424
+ return isInterpolating(type)
425
+ ? adjustScheme(scheme, extent, _.reverse)
426
+ : isFunction(scheme)
427
+ ? quantizeInterpolator(adjustScheme(scheme, extent), count)
428
+ : type === Ordinal
429
+ ? scheme
430
+ : scheme.slice(0, count);
431
+ }
432
+
433
+ function adjustScheme(scheme, extent, reverse) {
434
+ return isFunction(scheme) && (extent || reverse)
435
+ ? interpolateRange(scheme, flip(extent || [0, 1], reverse))
436
+ : scheme;
437
+ }
438
+
439
+ function flip(array, reverse) {
440
+ return reverse ? array.slice().reverse() : array;
441
+ }