summaryrefslogtreecommitdiff
path: root/ui/lib/swatch/derive.js
blob: 85547e8d39939bf168a5c58ebe7b0178b00f9b73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// A fun fact about $derive: if the deriving expression throws an error, then Svelte (at least as of
// 5.20.2) _permanently_ stops evaluating it, even if the inputs change. To prevent this, you need
// to ensure that derive expressions never raise an exception.
function tryDerive(args, func, fallback) {
  try {
    return func(...args);
  } catch (e) {
    console.debug('deriver threw exception', e, func, args);
    return fallback;
  }
}

// A "deriver" is a function that never raises; if the underlying function would raise, the
// corresponding deriver instead returns a fallback value (or `undefined`).
export function makeDeriver(func, fallback) {
  return (...args) => tryDerive(args, func, fallback);
}

// Some widely-used derivers, for convenience.
export const json = makeDeriver(JSON.parse);