Не включайте функцию 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)
);
Другие вопросы по тегам