Установить значение структуры для указанного объекта с помощью линзы Ramda

Учитывая этот объектив:

const obj = {
  foo: ['bar', 'qux']
}

const foo0Lens = R.lensPath(['foo', 0]);

R.set устанавливает foo первый элемент на указанное значение в объекте переменной:

R.set(foo0Lens, 'baz')(obj);

Хотя мне нужна функция, которая устанавливает foo первый элемент указанного объекта в значение переменной:

const setObjFoo0 = R.flip(R.set(foo0Lens))(obj);    
setObjFoo0('baz');

R.flip выполняет свою работу, но перебор аргументов делает код менее выразительным.

Как это должно быть сделано? Мне что-то не хватает в линзах Ramda? Есть ли другие способы удобно создавать setObjFoo0 с линзами?


person Estus Flask    schedule 09.10.2018    source источник


Ответы (1)


Что ж, это могло бы быть чище:

const setObjFoo0 = R.set(foo0Lens, R.__, obj)

На мой взгляд, это лучше, если не использовать префикс R.:

const setObjFoo0 = set(foo0Lens, __, obj)

Там заполнитель выглядит как заполнитель.

Были спорадические разговоры об удалении заполнителей из Ramda (отказ от ответственности: я один из авторов), но ничего не кажется неизбежным. И такие примеры, как этот, показывают, что иногда его использование значительно чище.

person Scott Sauyet    schedule 09.10.2018
comment
Спасибо, что напомнили о заполнителе. Действительно, это решение. Я надеюсь, что они не будут удалены, потому что это один из многих вариантов их использования. - person Estus Flask; 09.10.2018