Skip to content

Commit

Permalink
feat(router): add UrlSegment, RouteSegment, and Tree
Browse files Browse the repository at this point in the history
  • Loading branch information
vsavkin committed Apr 25, 2016
1 parent 3e11422 commit 90a1f7d
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 0 deletions.
66 changes: 66 additions & 0 deletions modules/angular2/src/alt_router/segments.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import {ComponentFactory} from 'angular2/core';
import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection';
import {Type, isBlank} from 'angular2/src/facade/lang';

export class Tree<T> {
constructor(private _nodes: T[]) {}

get root(): T { return this._nodes[0]; }

parent(t: T): T {
let index = this._nodes.indexOf(t);
return index > 0 ? this._nodes[index - 1] : null;
}

children(t: T): T[] {
let index = this._nodes.indexOf(t);
return index > -1 && index < this._nodes.length - 1 ? [this._nodes[index + 1]] : [];
}

firstChild(t: T): T {
let index = this._nodes.indexOf(t);
return index > -1 && index < this._nodes.length - 1 ? this._nodes[index + 1] : null;
}

pathToRoot(t: T): T[] {
let index = this._nodes.indexOf(t);
return index > -1 ? this._nodes.slice(0, index + 1) : null;
}
}

export class UrlSegment {
constructor(public segment: string, public parameters: {[key: string]: string},
public outlet: string) {}
}

export class RouteSegment {
/** @internal */
_type: Type;

/** @internal */
_componentFactory: ComponentFactory;

/** @internal */
_parameters: {[key: string]: string};

constructor(public urlSegments: UrlSegment[], parameters: {[key: string]: string},
public outlet: string, type: Type, componentFactory: ComponentFactory) {
this._type = type;
this._componentFactory = componentFactory;
this._parameters = parameters;
}

getParam(param: string): string { return this._parameters[param]; }

get type(): Type { return this._type; }
}

export function equalSegments(a: RouteSegment, b: RouteSegment): boolean {
if (isBlank(a) && !isBlank(b)) return false;
if (!isBlank(a) && isBlank(b)) return false;
return a._type === b._type && StringMapWrapper.equals(a._parameters, b._parameters);
}

export function routeSegmentComponentFactory(a: RouteSegment): ComponentFactory {
return a._componentFactory;
}
43 changes: 43 additions & 0 deletions modules/angular2/test/alt_router/tree_spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import {
ComponentFixture,
AsyncTestCompleter,
TestComponentBuilder,
beforeEach,
ddescribe,
xdescribe,
describe,
el,
expect,
iit,
inject,
beforeEachProviders,
it,
xit
} from 'angular2/testing_internal';

import {Tree} from 'angular2/src/alt_router/segments';

export function main() {
describe('tree', () => {
it("should return the root of the tree", () => {
let t = new Tree<any>([1, 2, 3]);
expect(t.root).toEqual(1);
});

it("should return the parent of a node", () => {
let t = new Tree<any>([1, 2, 3]);
expect(t.parent(1)).toEqual(null);
expect(t.parent(2)).toEqual(1);
});

it("should return the children of a node", () => {
let t = new Tree<any>([1, 2, 3]);
expect(t.children(1)).toEqual([2]);
});

it("should return the path to the root", () => {
let t = new Tree<any>([1, 2, 3]);
expect(t.pathToRoot(2)).toEqual([1, 2]);
});
});
}

0 comments on commit 90a1f7d

Please sign in to comment.