Skip to content

Commit ad9546c

Browse files
authored
feat(time-ranges): make TimeRanges iteratable if Symbol.iterator exists (#7330)
1 parent 2ad4d60 commit ad9546c

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

src/js/utils/time-ranges.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* @file time-ranges.js
33
* @module time-ranges
44
*/
5+
import window from 'global/window';
56

67
/**
78
* Returns the time for the specified index at the start or end
@@ -94,8 +95,10 @@ function getRange(fnName, valueIndex, ranges, rangeIndex) {
9495
* An array of time ranges.
9596
*/
9697
function createTimeRangesObj(ranges) {
98+
let timeRangesObj;
99+
97100
if (ranges === undefined || ranges.length === 0) {
98-
return {
101+
timeRangesObj = {
99102
length: 0,
100103
start() {
101104
throw new Error('This TimeRanges object is empty');
@@ -104,12 +107,19 @@ function createTimeRangesObj(ranges) {
104107
throw new Error('This TimeRanges object is empty');
105108
}
106109
};
110+
} else {
111+
timeRangesObj = {
112+
length: ranges.length,
113+
start: getRange.bind(null, 'start', 0, ranges),
114+
end: getRange.bind(null, 'end', 1, ranges)
115+
};
107116
}
108-
return {
109-
length: ranges.length,
110-
start: getRange.bind(null, 'start', 0, ranges),
111-
end: getRange.bind(null, 'end', 1, ranges)
112-
};
117+
118+
if (window.Symbol && window.Symbol.iterator) {
119+
timeRangesObj[window.Symbol.iterator] = () => (ranges || []).values();
120+
}
121+
122+
return timeRangesObj;
113123
}
114124

115125
/**

test/unit/utils/time-ranges.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* eslint-env qunit */
22
import { createTimeRanges, createTimeRange } from '../../../src/js/utils/time-ranges.js';
3+
import window from 'global/window';
34

45
QUnit.module('time-ranges');
56

@@ -76,3 +77,21 @@ QUnit.test('should throw without being given an index', function(assert) {
7677
'end throws if no index is given'
7778
);
7879
});
80+
81+
let testOrSkip = 'skip';
82+
83+
if (window.Symbol && window.Symbol.iterator) {
84+
testOrSkip = 'test';
85+
}
86+
QUnit[testOrSkip]('Array.from works on our time ranges object', function(assert) {
87+
const trRepresentation = [
88+
[0, 10],
89+
[20, 30]
90+
];
91+
let tr = createTimeRanges(trRepresentation);
92+
93+
assert.deepEqual(Array.from(tr), trRepresentation, 'we got back what we put in');
94+
95+
tr = createTimeRanges(0, 10);
96+
assert.deepEqual(Array.from(tr), [[0, 10]], 'we got back a ranges representation');
97+
});

0 commit comments

Comments
 (0)