2018-10-10 14:44:44 +00:00
|
|
|
import * as plugins from './smartrx.plugins';
|
|
|
|
import { Observable, Subscription } from 'rxjs';
|
|
|
|
import { Deferred } from 'smartq';
|
2017-11-01 13:59:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ObservableIntake
|
|
|
|
*/
|
|
|
|
export class ObservableIntake<T> {
|
2018-10-10 14:44:44 +00:00
|
|
|
observable: Observable<T>;
|
|
|
|
completed: Promise<void>;
|
|
|
|
private completedDeffered: Deferred<void>;
|
2017-11-01 13:59:28 +00:00
|
|
|
private observableFunctions: any = {
|
2018-10-10 14:44:44 +00:00
|
|
|
next: payloadArg => {
|
2017-11-01 13:59:28 +00:00
|
|
|
// nothing
|
|
|
|
},
|
2018-10-10 14:44:44 +00:00
|
|
|
complete: payloadArg => {
|
2017-11-01 13:59:28 +00:00
|
|
|
// nothing
|
|
|
|
}
|
2018-10-10 14:44:44 +00:00
|
|
|
};
|
|
|
|
private generator = null;
|
|
|
|
private buffered = false;
|
|
|
|
private payloadBuffer = [];
|
2017-11-01 13:59:28 +00:00
|
|
|
|
2018-10-10 14:44:44 +00:00
|
|
|
constructor() {
|
|
|
|
this.observable = Observable.create(observerArg => {
|
2017-11-01 13:59:28 +00:00
|
|
|
this.observableFunctions.next = (...args) => {
|
2018-10-10 14:44:44 +00:00
|
|
|
return observerArg.next(...args);
|
|
|
|
};
|
2017-11-01 13:59:28 +00:00
|
|
|
this.observableFunctions.complete = (...args) => {
|
2018-10-10 14:44:44 +00:00
|
|
|
this.completedDeffered.resolve();
|
|
|
|
return observerArg.complete(...args);
|
|
|
|
};
|
|
|
|
});
|
|
|
|
this.completedDeffered = plugins.smartpromise.defer();
|
|
|
|
this.completed = this.completedDeffered.promise;
|
2017-11-01 13:59:28 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 14:44:44 +00:00
|
|
|
setObservable(observableFunc) {
|
|
|
|
this.observable = observableFunc();
|
2017-11-01 13:59:28 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 14:44:44 +00:00
|
|
|
push(payloadArg: T) {
|
2017-11-01 16:01:30 +00:00
|
|
|
if (this.buffered) {
|
2018-10-10 14:44:44 +00:00
|
|
|
this.payloadBuffer.push(payloadArg);
|
2017-11-01 16:01:30 +00:00
|
|
|
} else {
|
2018-10-10 14:44:44 +00:00
|
|
|
this.internalPush(payloadArg);
|
2017-11-01 16:01:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* pushes many payloads as array
|
|
|
|
* @param payloadArgArray
|
|
|
|
*/
|
2018-10-10 14:44:44 +00:00
|
|
|
pushMany(payloadArgArray: T[]) {
|
2017-11-01 16:01:30 +00:00
|
|
|
for (let item of payloadArgArray) {
|
2018-10-10 14:44:44 +00:00
|
|
|
this.push(item);
|
2017-11-01 16:01:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sets a generator to query the next pushed value
|
|
|
|
* @param generatorArg
|
|
|
|
*/
|
2018-10-10 14:44:44 +00:00
|
|
|
setGenerator(generatorArg) {
|
|
|
|
this.generator = generatorArg;
|
2017-11-01 16:01:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
makeBuffered() {
|
2018-10-10 14:44:44 +00:00
|
|
|
this.buffered = true;
|
2017-11-01 13:59:28 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 14:44:44 +00:00
|
|
|
subscribe(...args) {
|
|
|
|
return this.observable.subscribe(...args);
|
2017-11-01 13:59:28 +00:00
|
|
|
}
|
|
|
|
|
2017-11-01 16:01:30 +00:00
|
|
|
/**
|
|
|
|
* request the next values in the quantity specified
|
|
|
|
* @param howManyArg if a generator is set, of a buffer exists, this allows retrieving values
|
|
|
|
*/
|
2018-10-10 14:44:44 +00:00
|
|
|
request(howManyArg: number) {
|
2017-11-01 16:01:30 +00:00
|
|
|
if (howManyArg === 0) {
|
2018-10-10 14:44:44 +00:00
|
|
|
return;
|
2017-11-01 16:01:30 +00:00
|
|
|
} else {
|
|
|
|
for (let i = 0; i !== howManyArg; i++) {
|
|
|
|
if (this.payloadBuffer.length > 0) {
|
2018-10-10 14:44:44 +00:00
|
|
|
this.internalPush(this.payloadBuffer.shift());
|
2017-11-01 16:01:30 +00:00
|
|
|
} else {
|
2018-10-10 14:44:44 +00:00
|
|
|
const nextPayload = this.generator();
|
|
|
|
this.internalPush(nextPayload);
|
2017-11-01 16:01:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* signals the completion of this observable
|
|
|
|
*/
|
2018-10-10 14:44:44 +00:00
|
|
|
signalComplete() {
|
|
|
|
this.observableFunctions.complete();
|
2017-11-01 13:59:28 +00:00
|
|
|
}
|
2017-11-01 16:01:30 +00:00
|
|
|
|
2018-10-10 14:44:44 +00:00
|
|
|
private internalPush(payloadArg) {
|
|
|
|
this.observableFunctions.next(payloadArg);
|
2017-11-01 16:01:30 +00:00
|
|
|
}
|
2017-11-01 13:59:28 +00:00
|
|
|
}
|