+ case "others":
+ return this.problems;
+ case "mine":
+ return this.myProblems;
+ }
+ },
+ // TODO?: get 50 from server but only show 10 at a time (for example)
+ showNext: function(direction) {
+ if (!this.curProb)
+ return this.fetchProblems(this.display, direction);
+ // Show next problem (older or newer):
+ let curProbs = this.curProblems();
+ // Try to find a neighbour problem in the direction, among current set
+ const neighbor = this.findClosestNeighbor(this.curProb, curProbs, direction);
+ if (!!neighbor)
+ {
+ this.curProb = neighbor;
+ return;
+ }
+ // Boundary case: nothing in current set, need to fetch from server
+ const curSize = curProbs.length;
+ this.fetchProblems(this.display, direction);
+ const newSize = curProbs.length;
+ if (curSize == newSize) //no problems found
+ return this.noMoreProblems("No more problems in this direction");
+ // Ok, found something:
+ this.curProb = this.findClosestNeighbor(this.curProb, curProbs, direction);
+ },
+ findClosestNeighbor: function(problem, probList, direction) {
+ let neighbor = undefined;
+ let smallestDistance = Number.MAX_SAFE_INTEGER;
+ for (let prob of probList)
+ {
+ const delta = Math.abs(prob.id - problem.id);
+ if (delta < smallestDistance &&
+ ((direction == "backward" && prob.id < problem.id)
+ || (direction == "forward" && prob.id > problem.id)))