public static Sequence append(Sequence s, TypedAST e) { Iterator<TypedAST> innerIter = s.iterator(); if (s instanceof DeclSequence && e instanceof Declaration) { return DeclSequence.simplify(new DeclSequence(s, e)); } return new Sequence( () -> new Iterator<TypedAST>() { private boolean fetched = false; @Override public boolean hasNext() { if (innerIter.hasNext()) return true; return !fetched; } @Override public TypedAST next() { if (innerIter.hasNext()) return innerIter.next(); if (!fetched) { fetched = true; return e; } throw new RuntimeException(); } }); }