default PTuple8<T1, T2, T3, T4, T5, T6, T7, T8> memo() { if (arity() != 8) return (PTuple8) PTuple7.super.memo(); PTuple8<T1, T2, T3, T4, T5, T6, T7, T8> host = this; Map<Integer, Object> values = new ConcurrentHashMap<>(); return new TupleImpl(Arrays.asList(), 8) { public T1 v1() { return (T1) values.computeIfAbsent(new Integer(0), key -> host.v1()); } public T2 v2() { return (T2) values.computeIfAbsent(new Integer(1), key -> host.v2()); } public T3 v3() { return (T3) values.computeIfAbsent(new Integer(2), key -> host.v3()); } public T4 v4() { return (T4) values.computeIfAbsent(new Integer(3), key -> host.v4()); } public T5 v5() { return (T5) values.computeIfAbsent(new Integer(4), key -> host.v5()); } public T6 v6() { return (T6) values.computeIfAbsent(new Integer(5), key -> host.v6()); } public T7 v7() { return (T7) values.computeIfAbsent(new Integer(6), key -> host.v7()); } public T8 v8() { return (T8) values.computeIfAbsent(new Integer(7), key -> host.v8()); } @Override public List<Object> getCachedValues() { return Arrays.asList(v1(), v2(), v3(), v4(), v5(), v6(), v7(), v8()); } @Override public Iterator iterator() { return getCachedValues().iterator(); } }; }