/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { ActivatedRoute, RouterState } from './router_state'; import { TreeNode } from './utils/tree'; /** * @param {?} routeReuseStrategy * @param {?} curr * @param {?} prevState * @return {?} */ export function createRouterState(routeReuseStrategy, curr, prevState) { var /** @type {?} */ root = createNode(routeReuseStrategy, curr._root, prevState ? prevState._root : undefined); return new RouterState(root, curr); } /** * @param {?} routeReuseStrategy * @param {?} curr * @param {?=} prevState * @return {?} */ function createNode(routeReuseStrategy, curr, prevState) { // reuse an activated route that is currently displayed on the screen if (prevState && routeReuseStrategy.shouldReuseRoute(curr.value, prevState.value.snapshot)) { var /** @type {?} */ value = prevState.value; value._futureSnapshot = curr.value; var /** @type {?} */ children = createOrReuseChildren(routeReuseStrategy, curr, prevState); return new TreeNode(value, children); } else if (routeReuseStrategy.retrieve(curr.value)) { var /** @type {?} */ tree = ((routeReuseStrategy.retrieve(curr.value))).route; setFutureSnapshotsOfActivatedRoutes(curr, tree); return tree; } else { var /** @type {?} */ value = createActivatedRoute(curr.value); var /** @type {?} */ children = curr.children.map(function (c) { return createNode(routeReuseStrategy, c); }); return new TreeNode(value, children); } } /** * @param {?} curr * @param {?} result * @return {?} */ function setFutureSnapshotsOfActivatedRoutes(curr, result) { if (curr.value.routeConfig !== result.value.routeConfig) { throw new Error('Cannot reattach ActivatedRouteSnapshot created from a different route'); } if (curr.children.length !== result.children.length) { throw new Error('Cannot reattach ActivatedRouteSnapshot with a different number of children'); } result.value._futureSnapshot = curr.value; for (var /** @type {?} */ i = 0; i < curr.children.length; ++i) { setFutureSnapshotsOfActivatedRoutes(curr.children[i], result.children[i]); } } /** * @param {?} routeReuseStrategy * @param {?} curr * @param {?} prevState * @return {?} */ function createOrReuseChildren(routeReuseStrategy, curr, prevState) { return curr.children.map(function (child) { for (var _i = 0, _a = prevState.children; _i < _a.length; _i++) { var p = _a[_i]; if (routeReuseStrategy.shouldReuseRoute(p.value.snapshot, child.value)) { return createNode(routeReuseStrategy, child, p); } } return createNode(routeReuseStrategy, child); }); } /** * @param {?} c * @return {?} */ function createActivatedRoute(c) { return new ActivatedRoute(new BehaviorSubject(c.url), new BehaviorSubject(c.params), new BehaviorSubject(c.queryParams), new BehaviorSubject(c.fragment), new BehaviorSubject(c.data), c.outlet, c.component, c); } //# sourceMappingURL=create_router_state.js.map