package net.ion.craken.expression; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; import net.ion.craken.node.NodeCommonMap; import net.ion.framework.util.SetUtil; public class TupleExpression extends ValueObject implements Expression { public final List<Expression> expressions; public TupleExpression(List<Expression> expressions) { this.expressions = Collections.unmodifiableList(expressions); } public static TupleExpression of(Expression... expressions) { return new TupleExpression(Arrays.asList(expressions)); } @Override public Comparable value(NodeCommonMap node) { ComparableSet result = new ComparableSet(); for (Expression exp : expressions) { result.add(exp.value(node)) ; } return result; } public List<Expression> expressions(){ return expressions ; } } class ComparableSet implements Set<Comparable>, Comparable<ComparableSet>{ private Set<Comparable> inner = SetUtil.newOrdereddSet() ; @Override public boolean add(Comparable e) { return inner.add(e); } @Override public boolean addAll(Collection<? extends Comparable> c) { return inner.addAll(c); } @Override public void clear() { inner.clear() ; } @Override public boolean contains(Object o) { return inner.contains(o); } @Override public boolean containsAll(Collection<?> c) { return inner.containsAll(c); } @Override public boolean isEmpty() { return inner.isEmpty(); } @Override public Iterator<Comparable> iterator() { return inner.iterator() ; } @Override public boolean remove(Object o) { return inner.remove(o); } @Override public boolean removeAll(Collection<?> c) { return inner.removeAll(c); } @Override public boolean retainAll(Collection<?> c) { return inner.retainAll(c); } @Override public int size() { return inner.size(); } @Override public Object[] toArray() { return inner.toArray(); } @Override public <T> T[] toArray(T[] a) { return inner.toArray(a); } public boolean equals(Object o){ return inner.equals(o) ; } public String toString(){ return inner.toString(); } @Override public int compareTo(ComparableSet o) { Comparable[] thisArray = toArray(new Comparable[0]); Comparable[] thatArray = o.toArray(new Comparable[0]); for (int i=0 ; i < thisArray.length ; i++) { if (thatArray.length <= i) return 1 ; if (thisArray[i].compareTo(thatArray[i]) != 0) return thisArray[i].compareTo(thatArray[i]) ; } if (thatArray.length > thisArray.length) return -1 ; return 0 ; } }