|
| 1 | +library angular2.src.alt_router.link; |
| 2 | + |
| 3 | +import "segments.dart" show Tree, TreeNode, UrlSegment, RouteSegment, rootNode; |
| 4 | +import "package:angular2/src/facade/lang.dart" |
| 5 | + show isBlank, isString, isStringMap; |
| 6 | +import "package:angular2/src/facade/collection.dart" show ListWrapper; |
| 7 | + |
| 8 | +Tree<UrlSegment> link( |
| 9 | + RouteSegment segment, Tree<UrlSegment> tree, List<dynamic> change) { |
| 10 | + if (identical(change.length, 0)) return tree; |
| 11 | + var normalizedChange = (identical(change.length, 1) && change[0] == "/") |
| 12 | + ? change |
| 13 | + : (new List.from(["/"])..addAll(change)); |
| 14 | + return new Tree<UrlSegment>(_update(rootNode(tree), normalizedChange)); |
| 15 | +} |
| 16 | + |
| 17 | +TreeNode<UrlSegment> _update(TreeNode<UrlSegment> node, List<dynamic> changes) { |
| 18 | + var rest = ListWrapper.slice(changes, 1); |
| 19 | + var outlet = _outlet(changes); |
| 20 | + var segment = _segment(changes); |
| 21 | + if (isString(segment) && segment[0] == "/") segment = segment.substring(1); |
| 22 | + // reach the end of the tree => create new tree nodes. |
| 23 | + if (isBlank(node)) { |
| 24 | + var urlSegment = new UrlSegment(segment, null, outlet); |
| 25 | + var children = identical(rest.length, 0) ? [] : [_update(null, rest)]; |
| 26 | + return new TreeNode<UrlSegment>(urlSegment, children); |
| 27 | + } else if (outlet != node.value.outlet) { |
| 28 | + return node; |
| 29 | + } else { |
| 30 | + var urlSegment = isStringMap(segment) |
| 31 | + ? new UrlSegment(null, segment, null) |
| 32 | + : new UrlSegment(segment, null, outlet); |
| 33 | + if (identical(rest.length, 0)) { |
| 34 | + return new TreeNode<UrlSegment>(urlSegment, []); |
| 35 | + } |
| 36 | + return new TreeNode<UrlSegment>( |
| 37 | + urlSegment, _updateMany(ListWrapper.clone(node.children), rest)); |
| 38 | + } |
| 39 | +} |
| 40 | + |
| 41 | +List<TreeNode<UrlSegment>> _updateMany( |
| 42 | + List<TreeNode<UrlSegment>> nodes, List<dynamic> changes) { |
| 43 | + var outlet = _outlet(changes); |
| 44 | + var nodesInRightOutlet = |
| 45 | + nodes.where((c) => c.value.outlet == outlet).toList(); |
| 46 | + if (nodesInRightOutlet.length > 0) { |
| 47 | + var nodeRightOutlet = nodesInRightOutlet[0]; |
| 48 | + nodes[nodes.indexOf(nodeRightOutlet)] = _update(nodeRightOutlet, changes); |
| 49 | + } else { |
| 50 | + nodes.add(_update(null, changes)); |
| 51 | + } |
| 52 | + return nodes; |
| 53 | +} |
| 54 | + |
| 55 | +dynamic _segment(List<dynamic> changes) { |
| 56 | + if (!isString(changes[0])) return changes[0]; |
| 57 | + var parts = changes[0].toString().split(":"); |
| 58 | + return parts.length > 1 ? parts[1] : changes[0]; |
| 59 | +} |
| 60 | + |
| 61 | +String _outlet(List<dynamic> changes) { |
| 62 | + if (!isString(changes[0])) return null; |
| 63 | + var parts = changes[0].toString().split(":"); |
| 64 | + return parts.length > 1 ? parts[0] : null; |
| 65 | +} |
0 commit comments