let filterTypes = {
$noop: () => () => false,
$eq: queryVal => (row, field) => eq(row[field], queryVal),
$ne: queryVal => (row, field) => ne(row[field], queryVal),
$gt: queryVal => (row, field) => gt(row[field], queryVal),
$gte: queryVal => (row, field) => gte(row[field], queryVal),
$lt: queryVal => (row, field) => lt(row[field], queryVal),
$lte: queryVal => (row, field) => lte(row[field], queryVal),
$in: queryVal => (row, field) =>
isarray(queryVal) && includes(row[field], queryVal),
$nin: queryVal => (row, field) =>
isarray(queryVal) && !includes(row[field], queryVal),
$text: queryVal => (row, field) => search(queryVal, row[field]) > 0,
$exists: queryVal => (row, field) =>
istruthy(queryVal) ? row.hasOwnProperty(field) : !row.hasOwnProperty(field),
$and: queryVal => (row, field) => true,
$or: queryVal => (row, field) => true
};