You've already forked wakapi-readme-stats
47 lines
1.0 KiB
JavaScript
47 lines
1.0 KiB
JavaScript
import {initRange} from "./init.js";
|
|
|
|
export const implicit = Symbol("implicit");
|
|
|
|
export default function ordinal() {
|
|
var index = new Map(),
|
|
domain = [],
|
|
range = [],
|
|
unknown = implicit;
|
|
|
|
function scale(d) {
|
|
var key = d + "", i = index.get(key);
|
|
if (!i) {
|
|
if (unknown !== implicit) return unknown;
|
|
index.set(key, i = domain.push(d));
|
|
}
|
|
return range[(i - 1) % range.length];
|
|
}
|
|
|
|
scale.domain = function(_) {
|
|
if (!arguments.length) return domain.slice();
|
|
domain = [], index = new Map();
|
|
for (const value of _) {
|
|
const key = value + "";
|
|
if (index.has(key)) continue;
|
|
index.set(key, domain.push(value));
|
|
}
|
|
return scale;
|
|
};
|
|
|
|
scale.range = function(_) {
|
|
return arguments.length ? (range = Array.from(_), scale) : range.slice();
|
|
};
|
|
|
|
scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
};
|
|
|
|
scale.copy = function() {
|
|
return ordinal(domain, range).unknown(unknown);
|
|
};
|
|
|
|
initRange.apply(scale, arguments);
|
|
|
|
return scale;
|
|
}
|