summaryrefslogtreecommitdiff
path: root/ui/lib/swatch/derive.js
blob: 22ceb1387ef2cd2fd8271d268b8dedddb29257f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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) {
    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 = undefined) {
  return (...args) => tryDerive(args, func, fallback);
}