Не включайте функцию ramdajs
У меня есть следующая структура данных:
const cluster = {
processes: [
{ color: 'test', x: 0, y: 0 },
...
],
};
А теперь я хочу сделать функцию со следующими обозначениями:
// getProcess :: (Cluster, number) -> Process
getProcess(cluster, 0);
// => { color: 'test', x: 0, y: 0 }
Ну, я пытаюсь использовать ramdajs для этого:
const getProcess = R.compose(R.flip(R.nth), R.prop('processes'));
Это хорошо работает для getProcess(cluster)(0)
но для getProcess(cluster, 0)
это возвращает функцию.
Есть ли способ решить эту проблему с помощью ramda или может быть более правильная реализация?
1 ответ
Ты можешь использовать R.uncurryN
чтобы достичь этого, нужно просто набрать количество аргументов, которые вы хотите использовать вместе с функцией карри.
const getProcess = R.uncurryN(2, R.compose(R.flip(R.nth), R.prop('processes')));
Это работает со всеми функциями карри, независимо от того, созданы ли они Рамдой или явно как следующее.
R.uncurryN(2, x => y => x + y)
Альтернативный способ написать это кратко с R.useWith
хотя я склонен находить применение useWith
менее читабельный, чем альтернативы.
const getProcess = R.useWith(R.nth, [R.identity, R.prop('processes')])
getProcess(0, cluster)
Иногда более прямой подход предпочтительнее.
const getProcess = R.curry(
(pos, entity) => R.path(['processes', pos], entity)
);