@Override public <T> boolean match(final OtpErlangObject term, final T bindings) { if (!(term instanceof OtpErlangTuple)) { return false; } final OtpErlangTuple t = (OtpErlangTuple) term; final int a = elems.length; if (a != t.elems.length) { return false; } for (int i = 0; i < a; i++) { if (!elems[i].match(t.elems[i], bindings)) { return false; } } return true; }
@Override public <T> boolean match(final OtpErlangObject term, final T binds) { if (!(term instanceof OtpErlangMap)) { return false; } final OtpErlangMap t = (OtpErlangMap) term; final int a = arity(); if (a > t.arity()) { return false; } if (a == 0) { return true; } OtpErlangObject key, val; for (final Map.Entry<OtpErlangObject, OtpErlangObject> e : entrySet()) { key = e.getKey(); val = e.getValue(); final OtpErlangObject v = t.get(key); if (v == null || !val.match(v, binds)) { return false; } } return true; }
@Override public <T> boolean match(final OtpErlangObject term, final T bindings) { if (!(term instanceof OtpErlangList)) { return false; } final OtpErlangList that = (OtpErlangList) term; final int thisArity = this.arity(); final int thatArity = that.arity(); final OtpErlangObject thisTail = this.getLastTail(); final OtpErlangObject thatTail = that.getLastTail(); if (thisTail == null) { if (thisArity != thatArity || thatTail != null) { return false; } } else { if (thisArity > thatArity) { return false; } } for (int i = 0; i < thisArity; i++) { if (!elementAt(i).match(that.elementAt(i), bindings)) { return false; } } if (thisTail == null) { return true; } return thisTail.match(that.getNthTail(thisArity), bindings); }