remove class statics for treeshaking bs

pull/4742/head
pushkine 5 years ago
parent 28b160f2fc
commit 0587fe4089

@ -11,36 +11,37 @@ interface Observable<T> {
} }
type Obs = Observable<unknown>[] | Observable<unknown>; type Obs = Observable<unknown>[] | Observable<unknown>;
type Deriver<T> = (values: any, setter?: Setter<T>) => void | (() => void) | T; type Deriver<T> = (values: any, setter?: Setter<T>) => void | (() => void) | T;
const value_queue = [];
const update_queue = [];
let is_flushing = false;
function flush(store: Store<any>) {
value_queue.push(store.value);
update_queue.push([...store.subscribers]);
if (is_flushing) return;
is_flushing = true;
for (let i = 0, j = 0, subscribers, value; i < update_queue.length; i++)
for (j = 0, subscribers = update_queue[i], value = value_queue[i]; j < subscribers.length; j++)
subscribers[j].run(value);
update_queue.length = value_queue.length = 0;
is_flushing = false;
}
/** /**
* Internal Svelte Observable * Internal Svelte Observable
*/ */
export class Store<T> { export class Store<T> {
static value_queue: Store<any>['value'][] = [];
static update_queue: Store<any>['subscribers'][] = [];
static is_flushing = false;
static flush(store: Store<any>) {
this.value_queue.push(store.value);
this.update_queue.push([...store.subscribers]);
if (this.is_flushing) return;
this.is_flushing = true;
for (let i = 0, j = 0, subscribers, value; i < this.update_queue.length; i++)
for (j = 0, subscribers = this.update_queue[i], value = this.value_queue[i]; j < subscribers.length; j++)
subscribers[j].run(value);
this.update_queue.length = this.value_queue.length = 0;
this.is_flushing = false;
}
value: T; value: T;
has_subscribers = false; has_subscribers: boolean;
subscribers = []; subscribers: any[];
constructor(initial: T) { constructor(initial: T) {
this.subscribers = [];
this.has_subscribers = false;
this.value = initial; this.value = initial;
} }
set(next_value: T) { set(next_value: T) {
this.value = next_value; this.value = next_value;
if (!this.has_subscribers) return; if (!this.has_subscribers) return;
for (let i = 0; i < this.subscribers.length; i++) this.subscribers[i].invalidate(); for (let i = 0; i < this.subscribers.length; i++) this.subscribers[i].invalidate();
Store.flush(this); flush(this);
} }
subscribe(run: Subscriber<T>, invalidate = noop) { subscribe(run: Subscriber<T>, invalidate = noop) {
const subscriber = { run, invalidate }; const subscriber = { run, invalidate };
@ -51,7 +52,7 @@ export class Store<T> {
unsubscribe(subscriber) { unsubscribe(subscriber) {
const index = this.subscribers.indexOf(subscriber); const index = this.subscribers.indexOf(subscriber);
if (~index) { if (~index) {
if (Store.is_flushing) subscriber.run = subscriber.invalidate = noop; if (is_flushing) subscriber.run = subscriber.invalidate = noop;
this.subscribers.splice(index, 1); this.subscribers.splice(index, 1);
this.has_subscribers = !!this.subscribers.length; this.has_subscribers = !!this.subscribers.length;
return true; return true;
@ -66,9 +67,10 @@ export class Store<T> {
*/ */
class StartStopWritable<T> extends Store<T> { class StartStopWritable<T> extends Store<T> {
start: StartStopNotifier<T>; start: StartStopNotifier<T>;
stop = noop; stop: typeof noop;
constructor(initial: T, startStopNotifier: StartStopNotifier<T>) { constructor(initial: T, startStopNotifier: StartStopNotifier<T>) {
super(initial); super(initial);
this.stop = noop;
this.start = startStopNotifier || noop; this.start = startStopNotifier || noop;
} }
subscribe(run, invalidate?) { subscribe(run, invalidate?) {
@ -100,7 +102,7 @@ export class Writable<T> extends StartStopWritable<T> {
} }
} }
export class Derived<S extends Obs, D extends Deriver<T>, T> extends StartStopWritable<T> { export class Derived<S extends Obs, D extends Deriver<T>, T> extends StartStopWritable<T> {
cleanup = noop; cleanup: typeof noop;
target; target;
deriver; deriver;
set: (value_s: unknown | unknown[]) => void; set: (value_s: unknown | unknown[]) => void;
@ -127,6 +129,7 @@ export class Derived<S extends Obs, D extends Deriver<T>, T> extends StartStopWr
} }
: (_set) => ((unsub) => void (unsub(), this.cleanup())).bind(this, subscribe(stores, this.set)) : (_set) => ((unsub) => void (unsub(), this.cleanup())).bind(this, subscribe(stores, this.set))
); );
this.cleanup = noop;
this.target = stores; this.target = stores;
this.set = this.set =
// deriver defines < 2 arguments ? // deriver defines < 2 arguments ?
@ -177,13 +180,15 @@ const parseStructure = <T>(
return schema; return schema;
}; };
abstract class MotionStore<T> extends Store<T> { abstract class MotionStore<T> extends Store<T> {
running = false; running: boolean;
cancel = noop; cancel: () => void;
init; init;
create; create;
tick; tick;
constructor(value: T, startSetTick: initCreateMotionTick<T> | initCreateTweenTick<T>) { constructor(value: T, startSetTick: initCreateMotionTick<T> | initCreateTweenTick<T>) {
super(value); super(value);
this.running = false;
this.cancel = noop;
this.create = parseStructure(value, (this.init = startSetTick))(super.set.bind(this)); this.create = parseStructure(value, (this.init = startSetTick))(super.set.bind(this));
} }
set(next_value: T) { set(next_value: T) {

@ -63,7 +63,7 @@ const reversed = (fn, rx, easing, start = 0, end = 1) => {
const difference = end - start; const difference = end - start;
return easing ? (t) => run(start + difference * easing(t)) : (t) => run(start + difference * t); return easing ? (t) => run(start + difference * easing(t)) : (t) => run(start + difference * t);
}; };
export enum tx { export const enum tx {
intro = 1, intro = 1,
outro = 2, outro = 2,
reverse = 3, reverse = 3,

Loading…
Cancel
Save