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
};