Index: tools/dom/templates/html/impl/impl_Node.darttemplate |
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate |
index 85671be8f333ec1dfaded12069f440148a379149..74fe51e4e4278c59a4ba3901de62bf0699c76982 100644 |
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate |
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate |
@@ -16,13 +16,49 @@ class _ChildNodeListLazy implements List { |
$if DART2JS |
- Node get first => JS('Node', '#.firstChild', _this); |
- Node get last => JS('Node', '#.lastChild', _this); |
+ Node get first { |
+ Node result = JS('Node', '#.firstChild', _this); |
+ if (result == null) throw new StateError("No elements"); |
+ return result; |
+ } |
+ Node get last { |
+ Node result = JS('Node', '#.lastChild', _this); |
+ if (result == null) throw new StateError("No elements"); |
+ return result; |
+ } |
+ Node get single { |
+ int l = this.length; |
+ if (l == 0) throw new StateError("No elements"); |
+ if (l > 1) throw new StateError("More than one element"); |
+ return JS('Node', '#.firstChild', _this); |
+ } |
$else |
- Node get first => _this.$dom_firstChild; |
- Node get last => _this.$dom_lastChild; |
+ Node get first { |
+ Node result = _this.$dom_firstChild; |
+ if (result == null) throw new StateError("No elements"); |
+ return result; |
+ } |
+ Node get last { |
+ Node result = _this.$dom_lastChild; |
+ if (result == null) throw new StateError("No elements"); |
+ return result; |
+ } |
+ Node get single { |
+ int l = this.length; |
+ if (l == 0) throw new StateError("No elements"); |
+ if (l > 1) throw new StateError("More than one element"); |
+ return _this.$dom_firstChild; |
+ } |
$endif |
+ Node min([int compare(Node a, Node b)]) { |
+ return _Collections.minInList(this, compare); |
+ } |
+ |
+ Node max([int compare(Node a, Node b)]) { |
+ return _Collections.maxInList(this, compare); |
+ } |
+ |
void add(Node value) { |
_this.$dom_appendChild(value); |
} |
@@ -32,8 +68,8 @@ $endif |
} |
- void addAll(Collection<Node> collection) { |
- for (Node node in collection) { |
+ void addAll(Iterable<Node> iterable) { |
+ for (Node node in iterable) { |
_this.$dom_appendChild(node); |
} |
} |
@@ -62,7 +98,7 @@ $endif |
_this.$dom_replaceChild(value, this[index]); |
} |
- Iterator<Node> iterator() => _this.$dom_childNodes.iterator(); |
+ Iterator<Node> get iterator => _this.$dom_childNodes.iterator; |
// TODO(jacobr): We can implement these methods much more efficiently by |
// looking up the nodeList only once instead of once per iteration. |
@@ -75,19 +111,56 @@ $endif |
return Collections.reduce(this, initialValue, combine); |
} |
- Collection map(f(Node element)) => Collections.map(this, [], f); |
+ String join([String separator]) { |
+ return Collections.joinList(this, separator); |
+ } |
+ |
+ List mappedBy(f(Node element)) => |
+ new MappedList<Node, dynamic>(this, f); |
- Collection<Node> filter(bool f(Node element)) => |
- Collections.filter(this, <Node>[], f); |
+ Iterable<Node> where(bool f(Node element)) => |
+ new WhereIterable<Node>(this, f); |
bool every(bool f(Node element)) => Collections.every(this, f); |
- bool some(bool f(Node element)) => Collections.some(this, f); |
+ bool any(bool f(Node element)) => Collections.any(this, f); |
bool get isEmpty => this.length == 0; |
// From List<Node>: |
+ List<Node> take(int n) { |
+ return new ListView<Node>(this, 0, n); |
+ } |
+ |
+ Iterable<Node> takeWhile(bool test(Node value)) { |
+ return new TakeWhileIterable<Node>(this, test); |
+ } |
+ |
+ List<Node> skip(int n) { |
+ return new ListView<Node>(this, n, null); |
+ } |
+ |
+ Iterable<Node> skipWhile(bool test(Node value)) { |
+ return new SkipWhileIterable<Node>(this, test); |
+ } |
+ |
+ Node firstMatching(bool test(Node value), {Node orElse()}) { |
+ return Collections.firstMatching(this, test, orElse); |
+ } |
+ |
+ Node lastMatching(bool test(Node value), {Node orElse()}) { |
+ return Collections.lastMatchingInList(this, test, orElse); |
+ } |
+ |
+ Node singleMatching(bool test(Node value)) { |
+ return Collections.singleMatching(this, test); |
+ } |
+ |
+ Node elementAt(int index) { |
+ return this[index]; |
+ } |
+ |
// TODO(jacobr): this could be implemented for child node lists. |
// The exception we throw here is misleading. |
void sort([int compare(Node a, Node b)]) { |