Do you want to: Suggest a feature
I would like to suggest a change in the Search functionality based on some of the use cases we have, when we try to search a small text in a large document, it freezes the whole page until we get the result.
Can we make this function use chunked text search with async boundaries to avoid stalling the entire editor, when searching for small sets of text.
const example_text = `
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dictum dignissim leo, ut faucibus neque lobortis in. Donec sapien ligula, feugiat eu consectetur at, venenatis sit amet odio. Maecenas sodales eget eros eu scelerisque. Maecenas in commodo sapien, non aliquet ipsum. Praesent non nisi eget quam suscipit feugiat. Vestibulum et felis non elit commodo vestibulum quis et odio. Nunc quis orci vulputate, rutrum dui vel, ultrices diam. Nulla facilisi. Aliquam luctus augue at tincidunt cursus. Integer gravida vel sem sed scelerisque.
Integer commodo consequat feugiat. Integer tristique erat in leo semper egestas. Praesent bibendum lacinia interdum. Fusce vitae tellus sit amet eros gravida interdum. Mauris eget neque ut ante auctor pellentesque. Nam ullamcorper nulla eu odio dapibus ultrices. Nulla sagittis eget mi sed hendrerit. Maecenas luctus sagittis accumsan. Proin auctor nulla leo, ut blandit nisl faucibus vitae. Vivamus iaculis, eros sit amet dapibus consequat, justo mi semper est, non cursus enim purus interdum leo. Vivamus mollis quam eget porttitor tempor. Praesent nibh erat, feugiat vitae felis a, tristique dignissim felis. Vestibulum posuere aliquam erat sit amet congue. Fusce at odio metus. Quisque viverra pulvinar ipsum, ac blandit leo.
Nam dolor ligula, cursus et tortor eget, sagittis accumsan velit. Quisque varius nibh non rhoncus rhoncus. Curabitur sagittis commodo est quis blandit. Donec dictum velit id dui feugiat, quis tincidunt lorem consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam ultrices elit in purus finibus sodales. Maecenas fermentum feugiat turpis sit amet faucibus. Nunc tempus dictum quam, in porta lacus ullamcorper sed. Vestibulum tincidunt ligula sapien, quis mollis mi interdum vitae. Maecenas lobortis nisi a aliquam rutrum. Vestibulum lacinia orci nec magna molestie maximus in vulputate sapien. Pellentesque lorem nibh, sollicitudin et hendrerit sed, fringilla ultricies magna. Nullam lobortis non tortor vitae egestas.
Vivamus tincidunt eu urna ac aliquam. Suspendisse vitae quam malesuada enim malesuada semper nec vitae nunc. Aliquam quis maximus eros, nec viverra urna. Nunc eleifend vitae enim a consectetur. Integer cursus, nisl id dignissim laoreet, lorem libero finibus diam, feugiat consequat justo tellus at lacus. Pellentesque efficitur lobortis diam, vitae laoreet ante hendrerit nec. Morbi sapien leo, pulvinar in sodales vel, bibendum vitae diam. In vulputate vestibulum rhoncus. Sed tortor augue, mollis non dictum at, gravida vel metus. Sed eros est, porttitor quis eleifend sit amet, cursus volutpat elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent non hendrerit urna, eget laoreet felis. Nulla sapien libero, placerat vitae vehicula sit amet, elementum nec elit.
Curabitur sed dui posuere enim dapibus aliquam ut eget ante. Quisque ac nulla facilisis, laoreet erat ut, suscipit mi. Integer at dui vel ipsum vehicula efficitur. Quisque lacinia laoreet convallis. Sed gravida odio sed risus faucibus, in molestie mi tincidunt. Etiam vehicula rhoncus est ut convallis. Nunc dui tortor, interdum eget purus eu, sollicitudin suscipit nulla. Duis semper vulputate congue. Aliquam erat volutpat. Nullam suscipit arcu quis ipsum sodales volutpat. Integer lacinia sodales magna, in efficitur risus congue ut. Vivamus imperdiet metus erat, in eleifend diam iaculis lacinia. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
`;
async function search(srcText, searchText) {
let matches = [];
const results = await Promise.allSettled(srcText
.split('\n')
.map(async (sentence) => {
if (sentence.includes(searchText)) {
const startIndex = sentence.indexOf(searchText);
return [startIndex, startIndex + searchText.length - 1];
}
return null;
}));
const error = results
.map(result => result?.reason)
.filter(error => !!error)
?.[0];
if (error) {
throw error;
}
return results
.map(result => result.value)
.filter(result => !!result);
}
async function main() {
const ranges = await search(example_text, "sit");
console.log(ranges);
}
Promise
.resolve(main())
.then(() => {})
.catch(e => console.log(`Failed to search: ${e}`))