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.
46 lines
1.1 KiB
46 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; |
|
}
|
|
|