This repository has been archived by the owner on Jun 10, 2020. It is now read-only.
/
arrayInfiniteComputer.js
56 lines (46 loc) · 1.74 KB
/
arrayInfiniteComputer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* @flow */
var InfiniteComputer = require('./infiniteComputer.js'),
bs = require('../utils/binaryIndexSearch.js');
class ArrayInfiniteComputer extends InfiniteComputer {
constructor(heightData/* : Array<number> */, numberOfChildren/* : number */)/* : void */ {
super(heightData, numberOfChildren);
this.prefixHeightData = this.heightData.reduce((acc, next) => {
if (acc.length === 0) {
return [next];
} else {
acc.push(acc[acc.length - 1] + next);
return acc;
}
}, []);
}
maybeIndexToIndex(index/* : ?number */)/* : number */ {
if (typeof index === 'undefined' || index === null) {
return this.prefixHeightData.length - 1;
} else {
return index;
}
}
getTotalScrollableHeight()/* : number */ {
var length = this.prefixHeightData.length;
return length === 0 ? 0 : this.prefixHeightData[length - 1];
}
getDisplayIndexStart(windowTop/* : number */)/* : number */ {
var foundIndex = bs.binaryIndexSearch(this.prefixHeightData, windowTop, bs.opts.CLOSEST_HIGHER);
return this.maybeIndexToIndex(foundIndex);
}
getDisplayIndexEnd(windowBottom/* : number */)/* : number */ {
var foundIndex = bs.binaryIndexSearch(this.prefixHeightData, windowBottom, bs.opts.CLOSEST_HIGHER);
return this.maybeIndexToIndex(foundIndex);
}
getTopSpacerHeight(displayIndexStart/* : number */)/* : number */ {
var previous = displayIndexStart - 1;
return previous < 0 ? 0 : this.prefixHeightData[previous];
}
getBottomSpacerHeight(displayIndexEnd/* : number */)/* : number */ {
if (displayIndexEnd === -1) {
return 0;
}
return this.getTotalScrollableHeight() - this.prefixHeightData[displayIndexEnd];
}
}
module.exports = ArrayInfiniteComputer;