NodeList.java revision c3f372b0c7c8ca4bed1261e7f1d3f17ed01b4889
176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti/* 276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2007-2010 Júlio Vilmar Gesser. 376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2011, 2013-2016 The JavaParser Team. 476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * This file is part of JavaParser. 676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser can be used either under the terms of 876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * a) the GNU Lesser General Public License as published by 976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * the Free Software Foundation, either version 3 of the License, or 1076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * (at your option) any later version. 1176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * b) the terms of the Apache License 1276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * You should have received a copy of both licenses in LICENCE.LGPL and 1476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * LICENCE.APACHE. Please refer to those files for details. 1576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser is distributed in the hope that it will be useful, 1776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * but WITHOUT ANY WARRANTY; without even the implied warranty of 1876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * GNU Lesser General Public License for more details. 2076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti */ 2176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti 22515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenpackage com.github.javaparser.ast; 23515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 24db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggenimport com.github.javaparser.HasParentNode; 250f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.AstObserver; 260f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.Observable; 27515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.GenericVisitor; 28008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilienimport com.github.javaparser.ast.visitor.Visitable; 29515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.VoidVisitor; 302adf38a7f2ee394f648d2fe7fc3e9b25810cde9dDanny van Bruggenimport com.github.javaparser.metamodel.InternalProperty; 31515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 326d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.*; 33c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggenimport java.util.function.*; 34c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggenimport java.util.stream.Collector; 356d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.stream.Stream; 366d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 37515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen/** 38db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen * A list of nodes. 399dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * It usually has a parent node. 4015c2aa05f936720e8f7efdedbbc68450a6f27fb3Danny van Bruggen * Unlike normal Nodes, this does not mean that it is a child of that parent. 419dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * Instead, this list will make every node it contains a child of its parent. 429dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * This way, a NodeList does not create an extra level inside the AST. 43515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * 44515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * @param <N> the type of nodes contained. 45515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen */ 46c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettipublic class NodeList<N extends Node> implements List<N>, Iterable<N>, HasParentNode<NodeList<N>>, Visitable, Observable { 472adf38a7f2ee394f648d2fe7fc3e9b25810cde9dDanny van Bruggen @InternalProperty 48515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private List<N> innerList = new ArrayList<>(0); 49515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 50db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen private Node parentNode; 51db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 52263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti private List<AstObserver> observers = new ArrayList<>(); 536d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 54515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList() { 55f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen this((Node) null); 56515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 57515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 58515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList(Node parent) { 59515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setParentNode(parent); 60515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 61515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 62796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen public NodeList(NodeList<N> n) { 63796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen this.addAll(n); 64796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen } 65796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen 66f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 67f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean add(N node) { 686d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(innerList.size(), node); 69515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 70f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.add(node); 71515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 72515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 73515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private void own(N node) { 74515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen if (node == null) { 75515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return; 76515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 77515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(node); 78515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 79515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 80515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean remove(Node node) { 81c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti int index = innerList.indexOf(node); 82c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti if (index != -1) { 83c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti notifyElementRemoved(index, node); 84c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti node.setParentNode(null); 85c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti } 869dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen return innerList.remove(node); 87515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 88515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 899dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen @SafeVarargs 90515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(X... nodes) { 91515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 929dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen Collections.addAll(nodeList, nodes); 93515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 94515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 95515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 96515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(Collection<X> nodes) { 97515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 98c3f372b0c7c8ca4bed1261e7f1d3f17ed01b4889Danny van Bruggen nodeList.addAll(nodes); 99515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 100515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 101515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 102515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(NodeList<X> nodes) { 103515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 1049dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen nodeList.addAll(nodes); 105515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 106515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 107515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 108515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean contains(N node) { 109515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.contains(node); 110515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 111515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 112f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 113515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public int size() { 114515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.size(); 115515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 116515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 117f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 118515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public N get(int i) { 119515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.get(i); 120515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 121515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 122515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen @Override 123515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Iterator<N> iterator() { 124515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen // TODO take care of "Iterator.remove" 125515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.iterator(); 126515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 127515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 128f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 129f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N set(int index, N element) { 1300d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti notifyElementReplaced(index, element); 131515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(element); 132f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.set(index, element); 133515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 134515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 135f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 136f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N remove(int index) { 137263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti notifyElementRemoved(index, innerList.get(index)); 138f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien N remove = innerList.remove(index); 139f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (remove != null) 140f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien remove.setParentNode(null); 141f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return remove; 142515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 143515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 144f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 145515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean isEmpty() { 146515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.isEmpty(); 147515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 148515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 149f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 150515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void sort(Comparator<? super N> comparator) { 151c3f372b0c7c8ca4bed1261e7f1d3f17ed01b4889Danny van Bruggen innerList.sort(comparator); 152515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 153515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 154515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void addAll(NodeList<N> otherList) { 155515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (N node : otherList) { 156515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen add(node); 157515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 158515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 159515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 160f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 161f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void add(int index, N node) { 1626d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(index, node); 163515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 164515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen innerList.add(index, node); 165515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 166db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 167db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 168008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien public Optional<Node> getParentNode() { 169008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien return Optional.ofNullable(parentNode); 170db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 171db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 172008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien /** 173008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * Sets the parentNode 1744296abb695b767f7471dd255d0679516183b062aDanny van Bruggen * 175008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @param parentNode the parentNode 176008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @return this, the NodeList 177008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien */ 178db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 179db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public NodeList<N> setParentNode(Node parentNode) { 180db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen this.parentNode = parentNode; 181db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen setAsParentNodeOf(innerList); 182db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return this; 183db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 184db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 185db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 186db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public Node getParentNodeForChildren() { 187db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return parentNode; 188db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 189db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 190008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 191db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 192db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return v.visit(this, arg); 193db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 194db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 195008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 196db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <A> void accept(final VoidVisitor<A> v, final A arg) { 197db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen v.visit(this, arg); 198db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 199db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 200f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 201f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.lang.Iterable#forEach(java.util.function.Consumer) 202f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 203f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 204f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void forEach(Consumer<? super N> action) { 205f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.forEach(action); 206f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 207f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 208f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 209f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#contains(java.lang.Object) 210f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 211f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 212f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean contains(Object o) { 213f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.contains(o); 214f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 215f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 216f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 217f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray() 218f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 219f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 220f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Object[] toArray() { 221f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(); 222f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 223f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 224f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 225f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray(java.lang.Object[]) 226f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 227f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 228f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public <T> T[] toArray(T[] a) { 229f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(a); 230f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 231f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 232f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 233f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#remove(java.lang.Object) 234f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 235f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 236f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean remove(Object o) { 237ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti if (o instanceof Node) { 2384296abb695b767f7471dd255d0679516183b062aDanny van Bruggen return remove((Node) o); 239ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } else { 240ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti return false; 241ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } 242f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 243f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 244f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 245f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#containsAll(java.util.Collection) 246f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 247f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 248f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean containsAll(Collection<?> c) { 249f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.containsAll(c); 250f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 251f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 252f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 253f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(java.util.Collection) 254f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 255f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 256f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(Collection<? extends N> c) { 2579dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen c.forEach(this::add); 2583e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti return !c.isEmpty(); 259f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 260f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 261f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 262f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(int, java.util.Collection) 263f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 264f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 265f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(int index, Collection<? extends N> c) { 266150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti for (N e : c) { 267150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti add(index++, e); 2683e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 269150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti return !c.isEmpty(); 270f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 271f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 272f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 273f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#removeAll(java.util.Collection) 274f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 275f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 276f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeAll(Collection<?> c) { 277ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti boolean changed = false; 278ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti for (Object e : c) { 279ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti changed = remove(e) || changed; 280f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 281ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti return changed; 282f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 283f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 284f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 285f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#retainAll(java.util.Collection) 286f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 287f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 288f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean retainAll(Collection<?> c) { 289cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti boolean changed = false; 290cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti for (Object e : this.stream().filter(it -> !c.contains(it)).toArray()) { 291cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti if (!c.contains(e)) { 292cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti changed = remove(e) || changed; 293cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 294cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 295cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti return changed; 296f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 297f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 298f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 299f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#replaceAll(java.util.function.UnaryOperator) 300f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 301f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 302f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void replaceAll(UnaryOperator<N> operator) { 3034296abb695b767f7471dd255d0679516183b062aDanny van Bruggen for (int i = 0; i < this.size(); i++) { 30434ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti set(i, operator.apply(this.get(i))); 30534ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti } 306f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 307f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 308f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 309f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#removeIf(java.util.function.Predicate) 310f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 311f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 312f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeIf(Predicate<? super N> filter) { 31355d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti boolean changed = false; 3144296abb695b767f7471dd255d0679516183b062aDanny van Bruggen for (Object e : this.stream().filter(filter).toArray()) { 31555d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti changed = remove(e) || changed; 31655d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti } 31755d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti return changed; 318f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 319f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 320f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 321f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#clear() 322f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 323f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 324f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void clear() { 3254a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti while (!isEmpty()) { 3264a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti remove(0); 3274a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti } 328f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 329f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 330f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 331f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#equals(java.lang.Object) 332f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 333f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 334f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean equals(Object o) { 335f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.equals(o); 336f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 337f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 338f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 339f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#hashCode() 340f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 341f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 342f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int hashCode() { 343f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.hashCode(); 344f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 345f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 346f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 347f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#indexOf(java.lang.Object) 348f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 349f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 350f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int indexOf(Object o) { 351f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.indexOf(o); 352f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 353f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 354f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 355f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#lastIndexOf(java.lang.Object) 356f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 357f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 358f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int lastIndexOf(Object o) { 359f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.lastIndexOf(o); 360f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 361f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 362f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 363f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator() 364f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 365f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 366f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator() { 367f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(); 368f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 369f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 370f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 371f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator(int) 372f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 373f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 374f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator(int index) { 375f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(index); 376f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 377f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 378f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 379f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#parallelStream() 380f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 381f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 382f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Stream<N> parallelStream() { 383f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.parallelStream(); 384f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 385f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 386f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 387f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#subList(int, int) 388f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 389f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 390f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public List<N> subList(int fromIndex, int toIndex) { 391f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.subList(fromIndex, toIndex); 392f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 393f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 394f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 395f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#spliterator() 396f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 397f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 398f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Spliterator<N> spliterator() { 399f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.spliterator(); 400c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassetti } 401263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 4026d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementAdded(int index, Node nodeAddedOrRemoved) { 40317c60f99a730acb68276303e7c6fcdf0a376258cFederico Tomassetti this.observers.forEach(o -> o.listChange(this, AstObserver.ListChangeType.ADDITION, index, nodeAddedOrRemoved)); 4046d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4056d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4066d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementRemoved(int index, Node nodeAddedOrRemoved) { 40717c60f99a730acb68276303e7c6fcdf0a376258cFederico Tomassetti this.observers.forEach(o -> o.listChange(this, AstObserver.ListChangeType.REMOVAL, index, nodeAddedOrRemoved)); 4086d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4096d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4100d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti private void notifyElementReplaced(int index, Node nodeAddedOrRemoved) { 4110d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti this.observers.forEach(o -> o.listReplacement(this, index, this.get(index), nodeAddedOrRemoved)); 4120d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti } 4130d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti 4146d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 415263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void unregister(AstObserver observer) { 4166d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.remove(observer); 4176d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4186d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4196d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 420263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void register(AstObserver observer) { 4216d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.add(observer); 422263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti } 423263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 424263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti @Override 425263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public boolean isRegistered(AstObserver observer) { 426263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti return this.observers.contains(observer); 427f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 428f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 429f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen /** 430f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * Replaces the first node that is equal to "old" with "replacement". 431f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * 432f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * @return true if a replacement has happened. 433f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen */ 434f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen public boolean replace(N old, N replacement) { 435f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen int i = indexOf(old); 436f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen if (i == -1) { 437f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen return false; 438f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen } 439f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen set(i, replacement); 440f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen return true; 441f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen } 44226ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen 44326ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen /** 44426ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen * @return the opposite of isEmpty() 44526ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen */ 44626ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen public boolean isNonEmpty() { 44726ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen return !isEmpty(); 44826ddbc38a65a4a8350afcb569923d7d66b7e6ee2Danny van Bruggen } 4497cd83c2e73deb47d79e71cc6afc3eb4b613302d1Danny van Bruggen 4507cd83c2e73deb47d79e71cc6afc3eb4b613302d1Danny van Bruggen public void ifNonEmpty(Consumer<? super NodeList<N>> consumer) { 4517cd83c2e73deb47d79e71cc6afc3eb4b613302d1Danny van Bruggen if (isNonEmpty()) 4527cd83c2e73deb47d79e71cc6afc3eb4b613302d1Danny van Bruggen consumer.accept(this); 4537cd83c2e73deb47d79e71cc6afc3eb4b613302d1Danny van Bruggen } 454c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen 455c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen public static <T extends Node> Collector<T, NodeList<T>, NodeList<T>> toNodeList() { 456c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen return Collector.of(NodeList::new, NodeList::add, (left, right) -> { 457c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen left.addAll(right); 458c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen return left; 459c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen }); 460c9f2a4fe27453e09a268730cd0ab76a42016475fDanny van Bruggen } 461515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen} 462