-
Notifications
You must be signed in to change notification settings - Fork 30
Open
Description
I am working on a todo app and I use predicates-rs to filter tasks before displaying them to the user. My Task
struct contains a id: TaskId
field and I want to use predicate::in_hash
to filter out tasks that have an id that is within a certain list.
I currently have code that looks roughly like this:
// base predicate that lets everything through
let predicate = predicate::always().boxed(); // BoxPredicate<Task>
if filter_unactionable {
let tasks_with_uncompleted_dependencies: Vec<TaskId> = task_database.iter_tasks().filter(|| ...).map(|t| t.id).collect();
let has_uncompleted_dependencies = predicate::in_hash(tasks_with_uncompleted_dependencies); // HashableInPredicate<TaskId>
predicate = predicate.and(has_uncompleted_dependencies.not()).boxed(); // error, differing types!
}
// other filters here
// `predicate` is returned and later used to filter which tasks to display
This code does not work because my in_hash
predicate expects a value of type TaskId
while my main predicate expects Task
.
To solve this, I'd like a way to "map" values before a predicate evaluates them. This could look like this (API is just a suggestion):
let predicate = predicate::always().boxed(); // BoxPredicate<Task>
if filter_unactionable {
let tasks_with_uncompleted_dependencies: Vec<TaskId> = task_database.iter_tasks().filter(|| ...).map(|t| t.id).collect();
let has_uncompleted_dependencies = predicate::in_hash(tasks_with_uncompleted_dependencies); // HashableInPredicate<TaskId>
// map from Predicate<Task> to PredicateTaskId
let has_uncompleted_dependencies_mapped = has_uncompleted_dependencies.map(|task: &Task| task.task_id);
predicate = predicate.and(has_uncompleted_dependencies_mapped.not()).boxed();
}
Metadata
Metadata
Assignees
Labels
No labels