ordinal.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import {InternMap} from "d3-array";
  2. import {initRange} from "./init.js";
  3. export const implicit = Symbol("implicit");
  4. export default function ordinal() {
  5. var index = new InternMap(),
  6. domain = [],
  7. range = [],
  8. unknown = implicit;
  9. function scale(d) {
  10. let i = index.get(d);
  11. if (i === undefined) {
  12. if (unknown !== implicit) return unknown;
  13. index.set(d, i = domain.push(d) - 1);
  14. }
  15. return range[i % range.length];
  16. }
  17. scale.domain = function(_) {
  18. if (!arguments.length) return domain.slice();
  19. domain = [], index = new InternMap();
  20. for (const value of _) {
  21. if (index.has(value)) continue;
  22. index.set(value, domain.push(value) - 1);
  23. }
  24. return scale;
  25. };
  26. scale.range = function(_) {
  27. return arguments.length ? (range = Array.from(_), scale) : range.slice();
  28. };
  29. scale.unknown = function(_) {
  30. return arguments.length ? (unknown = _, scale) : unknown;
  31. };
  32. scale.copy = function() {
  33. return ordinal(domain, range).unknown(unknown);
  34. };
  35. initRange.apply(scale, arguments);
  36. return scale;
  37. }