@angular-redux/store
Version:
Angular 2 bindings for Redux
45 lines (37 loc) • 1.21 kB
text/typescript
import { Observable } from 'rxjs/Observable';
import { Selector, Comparator, Transformer } from '../components/selectors';
const toKey = (val?: Object | Array<any> | Function | String) =>
val ? val.toString() : '';
const computeKey = (
selector: Selector<any, any>,
transformer?: Transformer<any, any>,
comparator?: Comparator) =>
`s:${toKey(selector)}:t:${toKey(transformer)}:c:${toKey(comparator)}`;
/**
* Used to pool Observables created by @select and @select$. This
* avoids memory leaks and improves efficiency.
* @hidden
*/
export class SelectionMap {
private _map: { [id: string]: Observable<any> } = {};
set(
selection: Observable<any>,
selector: Selector<any, any>,
transformer?: Transformer<any, any>,
comparator?: Comparator): void {
const key = computeKey(selector, transformer, comparator);
this._map[key] = selection;
}
get(
selector: Selector<any, any>,
transformer?: Transformer<any, any>,
comparator?: Comparator): Observable<any> {
const key = computeKey(selector, transformer, comparator);
return this._map[key];
}
reset() {
this._map = {};
}
}
/** @hidden */
export const selectionMap = new SelectionMap();