You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.1 KiB
47 lines
1.1 KiB
import {map} from "d3-collection";
|
|
import {slice} from "./array";
|
|
|
|
export var implicit = {name: "implicit"};
|
|
|
|
export default function ordinal(range) {
|
|
var index = map(),
|
|
domain = [],
|
|
unknown = implicit;
|
|
|
|
range = range == null ? [] : slice.call(range);
|
|
|
|
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 = map();
|
|
var i = -1, n = _.length, d, key;
|
|
while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
|
|
return scale;
|
|
};
|
|
|
|
scale.range = function(_) {
|
|
return arguments.length ? (range = slice.call(_), scale) : range.slice();
|
|
};
|
|
|
|
scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
};
|
|
|
|
scale.copy = function() {
|
|
return ordinal()
|
|
.domain(domain)
|
|
.range(range)
|
|
.unknown(unknown);
|
|
};
|
|
|
|
return scale;
|
|
}
|