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(); } }; }
/* * Lazily Map 7th element and memoise the result * @param fn Map function * @return */ default <T> PTuple8<T1, T2, T3, T4, T5, T6, T, T8> lazyMap7(Function<T7, T> fn) { if (arity() != 8) return (PTuple8) PTuple7.super.lazyMap7(fn); return new LazyMap7PTuple8(fn, (PTuple8) this); }
/** * Map the 7th element in a tuple to a different value * * @param fn Mapper function * @return new Tuple8 */ default <T> PTuple8<T1, T2, T3, T4, T5, T6, T, T8> map7(Function<T7, T> fn) { if (arity() != 8) return (PTuple8) PTuple7.super.map7(fn); return of(v1(), v2(), v3(), v4(), v5(), v6(), fn.apply(v7()), v8()); }
/** * Strict mapping of the first element * * @param fn Mapping function * @return Tuple8 */ default <T> PTuple8<T, T2, T3, T4, T5, T6, T7, T8> map1(Function<T1, T> fn) { if (arity() != 8) return (PTuple8) PTuple7.super.map1(fn); else return PowerTuples.tuple(fn.apply(v1()), v2(), v3(), v4(), v5(), v6(), v7(), v8()); }