namespace Eva { public class Tuple : Object, Term { private Term[] elements; public Tuple(Term[] terms) { elements = terms; } public int size { get { return elements.length; } } public new unowned Term get(int i) { assert(i >= 0 && i < size); return elements[i]; } public string to_string() { string ret = "{"; bool first = true; foreach(Term term in elements) { if(first) { first = false; ret += term.to_string(); } else { ret += "," + term.to_string(); } } return ret + "}"; } protected bool do_match(Term o, Gee.Map vars, Gee.Map aliases) { if(o is Var) { return o.do_match(this, vars, aliases); } if(!(o is Tuple)) return false; Tuple t = o as Tuple; if(t.size != size) return false; for(int i = 0; i < size; ++i) { if(!this[i].do_match(t[i], vars, aliases)) return false; } return true; } internal void encode(Buffer buffer) { buffer.buffer.encode_tuple_header(size); foreach(Term term in elements) { term.encode(buffer); } } } }