Skip to content

streamich/modern-pick

Repository files navigation

modern-pick

Modern selector/picker library utilizing JavaScript template literals.

const data = {
  weather: {
    data: {
      days: [{
        conditions: {temperatuer: 26}
      }]
    }
  }
});
pick`weather.data.days[0].conditions.temperature`()(data);
// 👉 26

Let's say you have a normalized Redux store.

{
  users: {
    byId: {
      // 1: {}
      // 2: {}
      // 3: {}
    }
  }
}

And you want to select all users aged over 18.

const getUsersOver18 = pick`users.byId${({age}) => age > 18}`();

Let's make the age threshold variable.

const getUsersOver = pick`users.byId${({age}) => over => u.age > over}`;
const getUsersOver18 = getUsersOver(18);

Let's limit the number of users to only first five.

const getUsersOver = pick`users.byId${u => over => u.age > over}${'0:5'}`;

Let's select only id and name fields.

const getUsersOver = pick`users.byId${u => over => u.age > over}${'0:5'}->{id,name}`;

Let's instead select only the last user and reformat our query to make it look smart.

const getUsersOver = pick`
  users.byId
  ${u => over => u.age > over}
  ${'-1:'}
  ->{id,name}
`;

Let's break it down.

  • users.byId — this is an accessor, it is compiled to state = state.users.byId.
  • ${u => over => u.age > over} — this filter expression is compiled to state = state.filter(u => u.age > over).
  • ${'-1:'} — this is a range expression in start:end:step format, it is compiled internally to a filter, too.
  • ->map operator -> tells us to do state = state.map(...) over the result set.
  • {id,name}destructuring accessor is internally compiled to state = (({id, name}) => ({id, name})(state).

All-in-all the above query is compiled to a JavaScript function like this:

const getUsersOver = (over) => (state, def) => {
  try {
    state = state.users.byId;
    state = Object.values(state);
    state = state.filter(u => u.age > over);
    state = state.filter((_, i) => i === state.length - 1);
    state = state.map(({id, name}) => ({id, name}));
    return state;
  } catch {
    return def;
  }
};

Usage

Install.

npm i modern-pick

Import.

import {id, idx, pick} from 'modern-pick';

Reference

  • id — identity function
  • idx — basic accessors
  • pick — pimped accessors

License

Unlicense — public domain.