Lint and format src/runtime/motion/tweened.js

pull/8569/head
S. Elliott Johnson 3 years ago
parent 28240a5486
commit 4b294516a3

@ -4,110 +4,110 @@ import { linear } from '../easing';
import { is_date } from './utils'; import { is_date } from './utils';
/** @returns {(t: any) => any} */ /** @returns {(t: any) => any} */
function get_interpolator(a, b) { function get_interpolator(a, b) {
if (a === b || a !== a) if (a === b || a !== a) return () => a;
return () => a; const type = typeof a;
const type = typeof a; if (type !== typeof b || Array.isArray(a) !== Array.isArray(b)) {
if (type !== typeof b || Array.isArray(a) !== Array.isArray(b)) { throw new Error('Cannot interpolate values of different type');
throw new Error('Cannot interpolate values of different type'); }
} if (Array.isArray(a)) {
if (Array.isArray(a)) { const arr = b.map((bi, i) => {
const arr = b.map((bi, i) => { return get_interpolator(a[i], bi);
return get_interpolator(a[i], bi); });
}); return (t) => arr.map((fn) => fn(t));
return (t) => arr.map((fn) => fn(t)); }
} if (type === 'object') {
if (type === 'object') { if (!a || !b) throw new Error('Object cannot be null');
if (!a || !b) if (is_date(a) && is_date(b)) {
throw new Error('Object cannot be null'); a = a.getTime();
if (is_date(a) && is_date(b)) { b = b.getTime();
a = a.getTime(); const delta = b - a;
b = b.getTime(); return (t) => new Date(a + t * delta);
const delta = b - a; }
return (t) => new Date(a + t * delta); const keys = Object.keys(b);
} const interpolators = {};
const keys = Object.keys(b); keys.forEach((key) => {
const interpolators = {}; interpolators[key] = get_interpolator(a[key], b[key]);
keys.forEach((key) => { });
interpolators[key] = get_interpolator(a[key], b[key]); return (t) => {
}); const result = {};
return (t) => { keys.forEach((key) => {
const result = {}; result[key] = interpolators[key](t);
keys.forEach((key) => { });
result[key] = interpolators[key](t); return result;
}); };
return result; }
}; if (type === 'number') {
} const delta = b - a;
if (type === 'number') { return (t) => a + t * delta;
const delta = b - a; }
return (t) => a + t * delta; throw new Error(`Cannot interpolate ${type} values`);
}
throw new Error(`Cannot interpolate ${type} values`);
} }
/** @param {T} value /** @param {T} value
* @param {Options<T>} defaults * @param {Options<T>} defaults
* @returns {import("/Users/elliottjohnson/dev/sveltejs/svelte/tweened.ts-to-jsdoc").Tweened<T>} * @returns {import("/Users/elliottjohnson/dev/sveltejs/svelte/tweened.ts-to-jsdoc").Tweened<T>}
*/ */
export function tweened(value, defaults = {}) { export function tweened(value, defaults = {}) {
const store = writable(value); const store = writable(value);
/** @type {Task} */ /** @type {Task} */
let task; let task;
let target_value = value; let target_value = value;
/** @param {T} new_value /** @param {T} new_value
* @param {Options<T>} opts * @param {Options<T>} opts
* @returns {any} * @returns {any}
*/ */
function set(new_value, opts) { function set(new_value, opts) {
if (value == null) { if (value == null) {
store.set((value = new_value)); store.set((value = new_value));
return Promise.resolve(); return Promise.resolve();
} }
target_value = new_value; target_value = new_value;
let previous_task = task; let previous_task = task;
let started = false; let started = false;
let { delay = 0, duration = 400, easing = linear, interpolate = get_interpolator } = assign(assign({}, defaults), opts); let {
if (duration === 0) { delay = 0,
if (previous_task) { duration = 400,
previous_task.abort(); easing = linear,
previous_task = null; interpolate = get_interpolator
} } = assign(assign({}, defaults), opts);
store.set((value = target_value)); if (duration === 0) {
return Promise.resolve(); if (previous_task) {
} previous_task.abort();
const start = now() + delay; previous_task = null;
let fn; }
task = loop((now) => { store.set((value = target_value));
if (now < start) return Promise.resolve();
return true; }
if (!started) { const start = now() + delay;
fn = interpolate(value, new_value); let fn;
if (typeof duration === 'function') task = loop((now) => {
duration = duration(value, new_value); if (now < start) return true;
started = true; if (!started) {
} fn = interpolate(value, new_value);
if (previous_task) { if (typeof duration === 'function') duration = duration(value, new_value);
previous_task.abort(); started = true;
previous_task = null; }
} if (previous_task) {
const elapsed = now - start; previous_task.abort();
if (elapsed > duration) { previous_task = null;
store.set((value = new_value)); }
return false; const elapsed = now - start;
} if (elapsed > duration) {
// @ts-ignore store.set((value = new_value));
store.set((value = fn(easing(elapsed / duration)))); return false;
return true; }
}); // @ts-ignore
return task.promise; store.set((value = fn(easing(elapsed / duration))));
} return true;
return { });
set, return task.promise;
update: (fn, opts) => set(fn(target_value, value), opts), }
subscribe: store.subscribe return {
}; set,
update: (fn, opts) => set(fn(target_value, value), opts),
subscribe: store.subscribe
};
} }
/** /**
* @typedef {(target_value: T, value: T) => T} Updater * @typedef {(target_value: T, value: T) => T} Updater
* @template T * @template T

Loading…
Cancel
Save