Adjust European short trip heuristic from >3 days to >1 day to correctly detect when user has returned home from European trips. This fixes the April 29-30, 2023 case where the location incorrectly showed "Sankt Georg, Hamburg" instead of "Bristol" when the user was free (no events scheduled) after the foss-north trip ended on April 27. The previous logic required more than 3 days to pass before assuming return home from European countries, but for short European trips by rail/ferry, users typically return within 1-2 days. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
93 lines
3.8 KiB
JavaScript
93 lines
3.8 KiB
JavaScript
/**
|
|
* @fileoverview Define 2 token factories; forward and backward.
|
|
* @author Toru Nagashima
|
|
*/
|
|
"use strict";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Requirements
|
|
//------------------------------------------------------------------------------
|
|
|
|
const BackwardTokenCommentCursor = require("./backward-token-comment-cursor");
|
|
const BackwardTokenCursor = require("./backward-token-cursor");
|
|
const FilterCursor = require("./filter-cursor");
|
|
const ForwardTokenCommentCursor = require("./forward-token-comment-cursor");
|
|
const ForwardTokenCursor = require("./forward-token-cursor");
|
|
const LimitCursor = require("./limit-cursor");
|
|
const SkipCursor = require("./skip-cursor");
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Helpers
|
|
//------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* The cursor factory.
|
|
* @private
|
|
*/
|
|
class CursorFactory {
|
|
|
|
/**
|
|
* Initializes this cursor.
|
|
* @param {Function} TokenCursor The class of the cursor which iterates tokens only.
|
|
* @param {Function} TokenCommentCursor The class of the cursor which iterates the mix of tokens and comments.
|
|
*/
|
|
constructor(TokenCursor, TokenCommentCursor) {
|
|
this.TokenCursor = TokenCursor;
|
|
this.TokenCommentCursor = TokenCommentCursor;
|
|
}
|
|
|
|
/**
|
|
* Creates a base cursor instance that can be decorated by createCursor.
|
|
* @param {Token[]} tokens The array of tokens.
|
|
* @param {Comment[]} comments The array of comments.
|
|
* @param {Object} indexMap The map from locations to indices in `tokens`.
|
|
* @param {number} startLoc The start location of the iteration range.
|
|
* @param {number} endLoc The end location of the iteration range.
|
|
* @param {boolean} includeComments The flag to iterate comments as well.
|
|
* @returns {Cursor} The created base cursor.
|
|
*/
|
|
createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments) {
|
|
const Cursor = includeComments ? this.TokenCommentCursor : this.TokenCursor;
|
|
|
|
return new Cursor(tokens, comments, indexMap, startLoc, endLoc);
|
|
}
|
|
|
|
/**
|
|
* Creates a cursor that iterates tokens with normalized options.
|
|
* @param {Token[]} tokens The array of tokens.
|
|
* @param {Comment[]} comments The array of comments.
|
|
* @param {Object} indexMap The map from locations to indices in `tokens`.
|
|
* @param {number} startLoc The start location of the iteration range.
|
|
* @param {number} endLoc The end location of the iteration range.
|
|
* @param {boolean} includeComments The flag to iterate comments as well.
|
|
* @param {Function|null} filter The predicate function to choose tokens.
|
|
* @param {number} skip The count of tokens the cursor skips.
|
|
* @param {number} count The maximum count of tokens the cursor iterates. Zero is no iteration for backward compatibility.
|
|
* @returns {Cursor} The created cursor.
|
|
*/
|
|
createCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments, filter, skip, count) {
|
|
let cursor = this.createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments);
|
|
|
|
if (filter) {
|
|
cursor = new FilterCursor(cursor, filter);
|
|
}
|
|
if (skip >= 1) {
|
|
cursor = new SkipCursor(cursor, skip);
|
|
}
|
|
if (count >= 0) {
|
|
cursor = new LimitCursor(cursor, count);
|
|
}
|
|
|
|
return cursor;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Exports
|
|
//------------------------------------------------------------------------------
|
|
|
|
module.exports = {
|
|
forward: new CursorFactory(ForwardTokenCursor, ForwardTokenCommentCursor),
|
|
backward: new CursorFactory(BackwardTokenCursor, BackwardTokenCommentCursor)
|
|
};
|