I can understand the use-case for this library, but I don't understand (even marginally) the "how" of it.
Let's take the example query in the readme:
const exampleQuery: MongoQuery = {
selector: {
age: {
$gt: 18
},
gender: 'm'
},
limit: 10,
sort: ['name', '_id']
};
And let's say these are the initial database contents: (as JSON)
[
{gender: "m", age: 10, name: "Bob"},
{gender: "m", age: 20, name: "Dan"},
{gender: "f", age: 10, name: "Alice"},
{gender: "f", age: 20, name: "Sally"},
]
So then, the initial result set for the query would be this:
[
{gender: "m", age: 20, name: "Dan"},
]
However, let's say a new user was just added:
{gender: "m", age: 30, name: "Mike"},
The new entry is, of course, a match for the query. And since the name "Mike" is later than "Dan", it should be added to the end of the query result set (rather than the start).
My specific question for this case then is: How on earth is your generic event-reduce algorithm able to know that the new "Michael" entry should be added after the "Dan" entry rather than before it?
This is of course easy to solve if you're hand-coding the query-result update system (eg. you do a binary search through the old results, to find the insert point for the new entry). But I currently have no idea how your library is able to accomplish this generically, based just on the MongoQuery params, the old results, and a change-stream entry. (it seems like it would have to recreate the entire MongoDB query execution code within the library -- yet the library's described as not being specific to MongoDB)
As explaining the entire algorithm would be too much to ask, I give the specific case above, in the hopes that there is an intuitive answer that can be given for this small case, that can give insight into how the library solves these cases in general.