Настроить политику моноклей в отношении отсутствующих вставленных узлов?

#typescript #monocle #haskell-optics #monocle-ts

Вопрос:

Есть ли способ в monocle (особенно в monocle-ts) изменить политику обработки отсутствующих вставленных узлов в структурированных данных, таких как в примерах A, B и C ниже, чтобы создавать их вместо того, чтобы не работать? У меня есть пример использования, в котором желательно другое поведение. Могу ли я работать в библиотеке, чтобы достичь этого?

 import { Optional } from "monocle-ts";

interface BazMaybe {
  baz?: number;
}

interface BarMaybe {
  bar?: BazMaybe;
}

interface FooMaybe {
  foo?: BarMaybe;
}

const baz = Optional.fromNullableProp<BazMaybe>()("baz");
const bar = Optional.fromNullableProp<BarMaybe>()("bar");
const foo = Optional.fromNullableProp<FooMaybe>()("foo");

const foo_bar_baz = foo.compose(bar).compose(baz);

// A) no op, gives `{}`
console.log(JSON.stringify(foo_bar_baz.set(42)({})));

// B) no op, gives `{"foo":{"bar":{}}}`
console.log(JSON.stringify(foo_bar_baz.set(42)({ foo: { bar: {} } })));

// C) no op, gives `{"foo":{"bar":{}}}`
console.log(JSON.stringify(foo_bar_baz.set(42)({ foo: { bar: { baz: undefined } } })));

// D) ok, finally, gives `{"foo":{"bar":{"baz":42}}}`
console.log(JSON.stringify(foo_bar_baz.set(42)({ foo: { bar: { baz: 0 } } }));
 

Кроме того, можем ли мы определить политику, чтобы всегда заменять пустые файлы во время обновлений на неопределенные (рекурсивно), чтобы обратная операция была согласованной?

 // E) ideally, this should give `{}`
console.log(JSON.stringify(foo.compose(bar).modify(
    ( baz, ...rest ) => 
        (rest))({ foo: { bar: { baz: 42} } })));