Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Converting binary search helper to TS #2129

Merged
merged 1 commit into from Feb 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 0 additions & 41 deletions src/utils/binary-search.js

This file was deleted.

44 changes: 44 additions & 0 deletions src/utils/binary-search.ts
@@ -0,0 +1,44 @@
type BinarySearchComparison < T > = (candidate: T) => -1 | 0 | 1;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: <T>

Also we should export type this. Generally anything that is used on the public path should be exported

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍
If I remember correctly, changing < T > to <T> resulted in this eslint error: https://eslint.org/docs/rules/space-infix-ops

I'd hate to suppress that eslint rule though, as it should error/warn in the case of const sum = 1+ 2 shouldn't it?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah if it's a lint thing then fine as long as it is consistent everywhere :)


const BinarySearch = {

/**
* Searches for an item in an array which matches a certain condition.
* This requires the condition to only match one item in the array,
* and for the array to be ordered.
*
* @param {Array<T>} list The array to search.
* @param {BinarySearchComparison<T>} comparisonFn
* Called and provided a candidate item as the first argument.
* Should return:
* > -1 if the item should be located at a lower index than the provided item.
* > 1 if the item should be located at a higher index than the provided item.
* > 0 if the item is the item you're looking for.
*
* @return {T | null} The object if it is found or null otherwise.
*/
search: function<T> (list: T[], comparisonFn: BinarySearchComparison<T>): T | null {
let minIndex: number = 0;
let maxIndex: number = list.length - 1;
let currentIndex: number | null = null;
let currentElement: T | null = null;

while (minIndex <= maxIndex) {
currentIndex = (minIndex + maxIndex) / 2 | 0;
currentElement = list[currentIndex];

let comparisonResult = comparisonFn(currentElement);
if (comparisonResult > 0) {
minIndex = currentIndex + 1;
} else if (comparisonResult < 0) {
maxIndex = currentIndex - 1;
} else {
return currentElement;
}
}

return null;
}
};

export default BinarySearch;