CharacterRange.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. 'use strict';
  2. var GetIntrinsic = require('get-intrinsic');
  3. var callBound = require('call-bound');
  4. var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
  5. var $TypeError = require('es-errors/type');
  6. var $charCodeAt = callBound('String.prototype.charCodeAt');
  7. var CharSet = require('../helpers/CharSet').CharSet;
  8. // https://262.ecma-international.org/16.0/#sec-runtime-semantics-characterrange-abstract-operation
  9. module.exports = function CharacterRange(A, B) {
  10. if (!(A instanceof CharSet) || !(B instanceof CharSet)) {
  11. throw new $TypeError('Assertion failed: CharSets A and B are not both CharSets');
  12. }
  13. var a;
  14. A.yield(function (c) {
  15. if (typeof a !== 'undefined') {
  16. throw new $TypeError('Assertion failed: CharSet A has more than one character');
  17. }
  18. a = c;
  19. });
  20. var b;
  21. B.yield(function (c) {
  22. if (typeof b !== 'undefined') {
  23. throw new $TypeError('Assertion failed: CharSet B has more than one character');
  24. }
  25. b = c;
  26. });
  27. var i = $charCodeAt(a, 0);
  28. var j = $charCodeAt(b, 0);
  29. if (!(i <= j)) {
  30. throw new $TypeError('Assertion failed: i is not <= j');
  31. }
  32. var arr = [];
  33. for (var k = i; k <= j; k += 1) {
  34. arr[arr.length] = $fromCharCode(k);
  35. }
  36. return arr;
  37. };