Skip to content

Commit 802119e

Browse files
refactor(TransitionQueue): Refactored TransitionQueue into a generic Queue class
1 parent cedd284 commit 802119e

File tree

4 files changed

+46
-42
lines changed

4 files changed

+46
-42
lines changed

src/common/queue.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
export default class Queue<T> {
2+
_items: Array<T>;
3+
4+
constructor() {
5+
this._items = [];
6+
}
7+
8+
enqueue(item: T) {
9+
this._items.push(item);
10+
return item;
11+
}
12+
13+
dequeue(): T {
14+
if (this.size())
15+
return this._items.splice(0, 1)[0];
16+
}
17+
18+
clear(): Array<T> {
19+
var current = this._items;
20+
this._items = [];
21+
return current;
22+
}
23+
24+
size(): number {
25+
return this._items.length;
26+
}
27+
28+
remove(item: T) {
29+
var idx = this._items.indexOf(item);
30+
return idx > -1 && this._items.splice(idx, 1)[0];
31+
}
32+
33+
peek(): T {
34+
return this._items[this._items.length - 1];
35+
}
36+
}

src/state/state.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import Glob from "./glob";
44
import StateQueueManager from "./stateQueueManager";
55
import StateBuilder from "./stateBuilder";
66
import StateMatcher from "./stateMatcher";
7-
import TransitionQueue from "./transitionQueue";
7+
import Queue from "../common/queue";
8+
import {Transition} from "../transition/transition"
89
import {TransitionRejection, RejectType, RejectFactory} from "../transition/rejectFactory";
910
import {defaultTransOpts} from "../transition/transitionService";
1011
import Param from "../params/param";
@@ -116,7 +117,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactoryProvider) {
116117
var matcher = new StateMatcher(states);
117118
var builder = new StateBuilder(function() { return root; }, matcher, $urlMatcherFactoryProvider);
118119
var stateQueue = new StateQueueManager(states, builder, $urlRouterProvider, $state);
119-
var transQueue = new TransitionQueue();
120+
var transQueue = new Queue<Transition>();
120121

121122

122123
/**
@@ -614,11 +615,11 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactoryProvider) {
614615
throw new Error(`No such reload state '${(isString(options.reload) ? options.reload : options.reload.name)}'`);
615616
}
616617

617-
var transition = transQueue.push($transition.create(
618+
var transition = transQueue.enqueue($transition.create(
618619
matcher.reference($state.current, null, extend({}, $stateParams)),
619620
matcher.reference(to, options && options.relative, toParams),
620621
extend(options, {
621-
current: transQueue.last.bind(transQueue)
622+
current: transQueue.peek.bind(transQueue)
622623
})
623624
));
624625

@@ -661,8 +662,8 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactoryProvider) {
661662

662663
if (error.type === RejectType.SUPERSEDED) {
663664
//if (error.redirected && error.detail instanceof Transition) { // TODO: expose Transition class for instanceof
664-
if (error.redirected && error.detail && isFunction(error.detail.run)) {
665-
transQueue.push(error.detail);
665+
if (error.redirected && error.detail instanceof Transition) {
666+
transQueue.enqueue(error.detail);
666667
return stateHandler.runTransition(error.detail);
667668
}
668669
}
@@ -688,9 +689,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactoryProvider) {
688689
};
689690

690691
var result = stateHandler.runTransition(transition);
691-
692-
// Pop the transition off the queue
693-
result.finally(pipe(val(transition), transQueue.pop.bind(transQueue)));
692+
result.finally(() => transQueue.remove(transition));
694693

695694
// Return a promise for the transition, which also has the transition object on it.
696695
// Allows, for instance:

src/state/transitionQueue.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/ui-router.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import StateMatcher from "./state/stateMatcher";
2626
import StateQueueManager from "./state/stateQueueManager";
2727
import StateReference from "./state/stateReference";
2828
//import StateService from "./state/stateService";
29-
import TransitionQueue from "./state/transitionQueue";
29+
import Queue from "./common/queue";
3030
var state = { Glob, stateInterface, state: stateState, StateBuilder, stateDirectives,
31-
stateEvents, stateFilters, StateMatcher, StateQueueManager, StateReference, TransitionQueue};
31+
stateEvents, stateFilters, StateMatcher, StateQueueManager, StateReference, Queue};
3232

3333
import HookBuilder from "./transition/hookBuilder"
3434
import * as rejectFactory from "./transition/rejectFactory"

0 commit comments

Comments
 (0)